这个问题是这个旧问题的后续问题,它更像是一个确认而不是一个开放的问题.
我的ViewModel实例有一个Model的私有实例_modelInst.
ViewModel在编辑期间可以独占访问Model的数据(因此Model不需要实现INotifyPropertyChanged).
现在我有三种方法可以从视图中编辑模型数据:
直接在Model实例上获取/设置,
例如,对于简单的值字段,
return _modelInst.fieldname;
_modelInst.fieldname = value;
这个很容易实现...
创建一个ViewModel实例并对父数据结构
进行操作,例如对于更复杂的对象类型,如结构:
这意味着_modelInst为每个结构创建一个由父级实现的新接口(使用更新例程).
创建ViewModel实例,而不直接了解父类的数据结构,
例如父类中的(列表)类
为每个类创建一个新的ViewModel
通过以下方式向父级发送更新说明
所有这些都是一个很大的混乱实现,为可编辑的模型的每个领域创建功能.
这几乎意味着模型的所有领域......
(4.)可以创建一个通用的ViewModel,它只通过反射工作,其中每个子对象都知道它的父对象和它的字段名(+ index,如果在列表中).
只有root的逻辑才会干扰模型.
但是,该解决方案还需要一种方法来存储其中的字段的路径_modelInst.
有没有其他(更简单)的方法来实现这一目标?
我是否(再次)误解了MVVM的原理?
MVVM是否适合处理大型分层数据结构?
我知道这可能听起来像一个主观问题,但我需要一些有关这个主题的有根据的意见:
在C#/ WPF GUI中,我需要播放短波文件作为对用户交互的响应.
规格如下:
到目前为止,我与DirectSound(使用Microsoft DirectX SDK)相处得很好,它符合上面提到的所有要求.从Visual Studio 2010(.Net 4.0)开始,Managed DirectX(MDX)不再受支持,它也从最新的DirectX SDK中消失.
我现在有什么选择?
我真的很困惑我应该用哪个新项目.我不想深入研究一个全新的框架,只是为了发现它的局限性阻止我使用它.
提前致谢!
希望这不是重复的。如果是这样,请在评论中指出我,我将再次删除该问题。
我有一个数据对象,其中的数据仅在捆绑包中有效 - 即,在不使其他成员无效的情况下更改一个成员的值是没有意义的。
该数据对象描述了一些图像信息:
struct ImageInfo
{
ImageInfo(const double &ppix, ...)
: PpiX(ppix),
...
{ }
const double PpiX;
const double PpiY;
const int SizeX;
const int SizeY;
};
Run Code Online (Sandbox Code Playgroud)
在我的图像对象中,我有一个类型的非常量成员ImageInfo:
class MyImageObject
{
...
private:
ImageInfo mMyInfo;
}
Run Code Online (Sandbox Code Playgroud)
我希望能够mMyInfo在运行时进行更改,但前提是它需要一个新的 ImageInfo(...) 实例。
在该MyImageObject::Load()函数中,我想从文件信息中读取此数据,然后ImageInfo使用正确的数据集创建一个实例:
double ppix = ImageFile.GetPpiX();
...
mMyInfo = ImageInfo(ppix, ...);
Run Code Online (Sandbox Code Playgroud)
但我无法编写一个有效的赋值运算符(复制构造函数当然是可能的)。我的解决方案留空mMyInfo,因为我没有引用this:
ImageInfo operator=(const ImageInfo &other)
{
// no reference to *this
return ImageInfo(other);
} …Run Code Online (Sandbox Code Playgroud) 在 Qt 的 keyPressEvent() 和 keyReleaseEvent() 中,我试图获得键 + 修饰符的数字键盘输入。
使用void MyWidget::keyPressEvent(QKeyEvent *evt),evt->key()给出键码 (Qt::Key) 并evt->modifiers()给出键盘修饰符 (QFlags)。
下表显示了有关关键事件的所有可用 Qt 值的读数。
要重现的击键:关闭 NumLock,按下并释放 num_5,然后按下并释放 shift,然后按下 shift -> 按 num_5 -> 释放 num_5 -> 释放 shift,然后将 NumLock 切换为打开并重复相同的按键操作。
table headers:
natSC = evt->nativeScanCode()
natMods = evt->nativeModifiers()
kbdMods = QGuiApplication::keyboardModifiers()
queryKbdMods = QGuiApplication::queryKeyboardModifiers()
NumLock | Action | Event | evt->key() | evt->modifiers() | …Run Code Online (Sandbox Code Playgroud) 我“不小心”将信号连接到QWidget::setToolTip():
bool ok = connect(source, &Source::textSignal, widget, &QWidget::setToolTip);
Q_ASSERT(ok);
Run Code Online (Sandbox Code Playgroud)
......它奏效了。不仅连接成功,函数也被正确调用。
自己试试:
main.cpp
#include <QApplication>
#include <QLineEdit>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QLineEdit le;
bool ok = QObject::connect(&le, &QLineEdit::textChanged, &le, &QWidget::setToolTip);
Q_ASSERT(ok);
le.show();
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
setToolTip()未声明为slot.
来自 qwidget.h:
// [...]
public Q_SLOTS: // start of Q_SLOTS
void setWindowTitle(const QString &);
#ifndef QT_NO_STYLE_STYLESHEET
void setStyleSheet(const QString& styleSheet);
#endif
public: // from my understanding, this should end the Q_SLOTS region
#ifndef QT_NO_STYLE_STYLESHEET
QString …Run Code Online (Sandbox Code Playgroud) 我正在创建一个编辑用户页面,其中包含从数据库中的数据填充的文本框和下拉菜单.
我目前调用一个函数来填充下拉菜单.例如,以下是我用来填充下拉列表的代码:
<select name="manager">;
<?php
// printing the list box select command
foreach($managerDetails as $row){
//Array or records stored in $managerDetails
echo "<option value='${row['userID']}'>
${row['lastName']}, ${row['firstName']}
</option>";
/* Option values are added by looping through the array */
}
?>
</select>
Run Code Online (Sandbox Code Playgroud)
我试图让组合框自动显示数据库中的值.我试图将其作为以下值:
value="<?php echo $userDetails['managerID']; ?>"
Run Code Online (Sandbox Code Playgroud)
谢谢.
我在时间23:59:59传递到第二天时收到以下消息.我不知道(因为代码是由其他人编写的)它来自哪里.有谁能建议如何找出问题?谢谢!
QObject::connect: Cannot queue arguments of type 'QItemSelection'
(Make sure 'QItemSelection' is registered using qRegisterMetaType().)
QObject::connect: Cannot queue arguments of type 'QItemSelection'
(Make sure 'QItemSelection' is registered using qRegisterMetaType().)
QObject::connect: Cannot queue arguments of type 'QItemSelection'
(Make sure 'QItemSelection' is registered using qRegisterMetaType().)
Run Code Online (Sandbox Code Playgroud) 我偶然发现了我正在使用的共享指针的意外行为.
共享指针实现引用计数和分离(例如,复制),如果需要,包含非const使用的实例.
为实现此目的,对于每个getter函数,智能指针都有一个const和一个non-const版本,例如:operator T *()和operator T const *() const.
问题:比较指针值nullptr导致分离.
预期:我认为比较运算符总是会调用const版本.
简化示例:(
此实现没有引用计数,但仍显示问题)
#include <iostream>
template<typename T>
class SharedPointer
{
public:
inline operator T *() { std::cout << "Detached"; return d; }
inline operator const T *() const { std::cout << "Not detached"; return d; }
inline T *data() { std::cout << "Detached"; return d; }
inline const T *data() const { std::cout << "Not detached"; …Run Code Online (Sandbox Code Playgroud)