我正在尝试学习一些Qt编程(C ++)以及与UI相关的所有内容,我来自C#和WPF / MVVM。问题是我在选择背后推理推理过程时遇到了问题。
我要做的是将对象的列表(或向量或某种ObservableCollection)链接到按钮列表,以便UI为列表中的每个元素显示一个按钮。
假设我有一个Customer类(在C#中将是我的模型),包含2个变量(加上get / set方法,或者在C#中调用它们的“Properties”):Name和Type。每个按钮都会显示相应的名称,单击会将Type发送到处理呼叫的方法。
现在,我无法访问带有VS的计算机,但在C#中,我会做一些事情,比如创建一个View和一个ViewModel(即Controller)。在VM中,我将创建一个ObservableCollection的Customers,它在修改时引发RaisePropertyChanged事件,在View中我将创建一个绑定到ObservableCollection的ItemsControl,并使用DataTemplate作为Button。该按钮将其Content属性绑定到Customer的Name,并使用CommandParameter(即使用click事件发送的参数)Model本身或Customer Type,根据其值进行不同的选择。这样改变ObservableCollection会修改显示的按钮数。
现在我的问题是:如何在Qt中做同样的事情?我想出的最好的方法是创建一个Customer类的向量,并在for循环中创建:
for (unsigned int i = 0; i < model_vector.size(); ++i)
{
QPushButton* btn = new QPushButton(this);
btn->setText(model_vector[i].Name);
ui->verticalLayout->addWidget(btn);
connect(btn, SIGNAL (released()),this, SLOT (handleButton(model_vector[i])));
btn->show();
}
我会把这个循环放在一个被调用来更新model_vector的方法中,这样我就可以清除verticalLayout并重新添加当前包含在向量中的所有按钮。
无论如何,这对我来说似乎不是一个真正的模型/视图方法(从我在Qt文档中读到的意义),但也许我只是误解了Qt是如何工作的。
我正在做的还是更好的方法吗?
谢谢!
答案 0 :(得分:0)
您的原始方法听起来很像基于QtQuick的UI。
模型将提供数据,QtQuick ListView
(或类似)将提供一般视图功能并在模型和实际条目可视化之间进行调解,称为委托。
在这种情况下,代表将是一个按钮。