从C#/ WPF过渡到C ++ / Qt:dinamically生成一个按钮列表

时间:2016-12-26 11:26:27

标签: c# c++ wpf qt model-view

我正在尝试学习一些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是如何工作的。

我正在做的还是更好的方法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您的原始方法听起来很像基于QtQuick的UI。

模型将提供数据,QtQuick ListView(或类似)将提供一般视图功能并在模型和实际条目可视化之间进行调解,称为委托。 在这种情况下,代表将是一个按钮。