C#/WPF到C++/Qt的转换:动态生成按钮列表

Transition from C#/WPF to C++/Qt: dinamically generate a button list

我正在尝试学习一些 Qt 编程 (C++),对于 UI 相关的所有内容,我来自 C# WPF/MVVM。问题是我在转换推理过程时遇到了问题。

我想做的是 link 对象列表(或向量或某种 ObservableCollection)到按钮列表,这样 UI 将显示一个按钮列表中的每个元素。

假设我有一个客户 class(在 C# 中将是我的模型)和 2 个变量(加上 get/set 方法,或在 C# 中调用的 "Properties"):名称和类型。每个按钮都会显示相应的名称,点击会将类型发送到处理调用的方法。

现在,这些天我无法访问带有 VS 的机器,但在 C# 中我会做一些事情,比如创建一个视图和一个 ViewModel(即控制器)。在 VM 中,我将创建一个 ObservableCollection of Customers,当它被修改时引发 RaisePropertyChanged 事件,在视图中,我将创建一个绑定到 ObservableCollection 的 ItemsControl,作为 DataTemplate 按钮。该按钮会将其 Content 属性 绑定到客户的名称,并使用 CommandParameter(即随点击事件发送的参数)模型本身或客户类型,以根据其值做出不同的选择。这样更改 ObservableCollection 将修改显示的按钮数。

现在我的问题是:如何在 Qt 中做同样的事情?我想出的最好办法是创建此客户的矢量 class 并在 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 并重新添加此时矢量中包含的所有按钮。

无论如何,这在我看来并不是真正的 Model/View 方法(在我阅读 Qt 文档的意义上),但也许我只是误解了 Qt 的工作原理。

我的做法是否正确或是否有更好的方法?

谢谢!

您最初的方法听起来很像您使用基于 QtQuick 的方法UI。

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