【问题标题】:Populating a table in Qt在 Qt 中填充表
【发布时间】:2013-06-04 12:05:07
【问题描述】:

我正在尝试改进图表编辑器的 this 示例。

该示例使用了一个 nodes 类,其中包含一些与我的需求无关的属性。现在我想向这个 node 类添加一个“数组列表”,以便在“属性”对话框中填充一个 QTableView。我已经用 QTableView 设计了属性对话框。我什至不确定这是否可行/有意义。

基本上表格必须有4列:nametypevalueunit

表格的每一行都是我需要节点拥有的某个“属性”。

我的问题是:我如何/应该如何在班级级别对表格进行建模?我问这个是因为我一直在寻找 QList、QVariant、QMap、QMultiMap,但我无法弄清楚正确使用它们,到目前为止我发现的所有示例都没有任何帮助,至少对于我需要做的事情。我看到了一些关于 QStandardItemModel 类的东西,我认为它与解决方案有关,但我不明白如何/为什么。

最重要的是,我是 Qt/C++ 初学者,Qt/C++ 中的很多动态和术语仍然让我难以理解。

如果有人能给我一些建议,那就太好了。

编辑: 这个没有引起太多关注,不知道是不是因为我不够清楚,但无论如何,试着想象一下:

  • 一个 Node 有一个 PropertyList
  • PropertyList 列出了 Properties
  • Properties 是一种字典,因为它们有 always 4 个属性和各自的值:name:(string), type:(string), value:(double) 和 unit:(string)。
  • 一个Node只能有一个PropertyList;一个 PropertyList 可以有多个 Properties。一些节点会有3个属性,其他会有4个,等等...

现在,节点通过带有 QGraphicsItem 的 QGraphicsScene 在图表中表示。您可以访问其中包含 QTableWidgetPropertiesDialog 小部件。此表将显示 PropertyList

我想知道我可以创建/定义什么样的“结构”,使我能够轻松地在表格小部件中插入/读取数据 - 即,我将数据加载到Node 并显示在表格小部件中;如果我更改表格小部件中的数据,它会传递到 NodePropertiesList

希望这有助于消除可能出现的任何疑问。

【问题讨论】:

  • PropertyWidget 应该只包含选定节点的属性数据。因此,当您选择一个节点时,将该节点传递给 PropertyWidget 并让 PropertyWidget 提取 PropertyList 以填充其自己的用于编辑的数据模型。当属性值改变时,获取 PropertyWidget 告诉 Node 新值是什么,然后 Node 可以在必要时修改 QGraphicsItem。
  • @RobbieE 已经完成了。属性对话框只影响它应该影响的节点。我应该如何定义 Node 类的数据成员以及如何将这些成员值传递给属性对话框中的表格小部件?

标签: c++ qt qtablewidget qtablewidgetitem


【解决方案1】:

好吧,在拉了很多头发之后,我得到了我需要的东西。

我的第一步是创建一个Property 类。此类具有设置或获取 name 字符串、type 字符串、value double 和 unit 的函数字符串。

接下来,我更新了 Node 类以包含添加和删除指向 QList<Property *>Property 对象指针的函数。还包括一个 listProperties 函数,它返回来自某个 Node 的所有 Property 对象。

此后,用某个Node 的属性填充QTableWidget 的函数编码如下:

    propertiesList = node->listMyProperties();

    for (int row = 0; row < propertiesList.size(); ++row) {
        Property *property = propertiesList.at(row);
        addRow();
        tableWidget->item(row, 0)->setData(Qt::DisplayRole, property->propertyName());
        tableWidget->item(row, 1)->setData(Qt::DisplayRole, property->propertyType());
        tableWidget->item(row, 2)->setData(Qt::DisplayRole, property->propertyValue());
        tableWidget->item(row, 3)->setData(Qt::DisplayRole, property->propertyUnit());
    }

还有addRow() 函数:

void PropertiesDialog::addRow()
{
    int row = tableWidget->rowCount();

    tableWidget->insertRow(row);

    QTableWidgetItem *item0 = new QTableWidgetItem;
    item0->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
    tableWidget->setItem(row, 0, item0);

    QTableWidgetItem *item1 = new QTableWidgetItem;
    item1->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
    tableWidget->setItem(row, 1, item1);

    QTableWidgetItem *item2 = new QTableWidgetItem;
    item2->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
    tableWidget->setItem(row, 2, item2);

    QTableWidgetItem *item3 = new QTableWidgetItem;
    item3->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
    tableWidget->setItem(row, 3, item3);

    tableWidget->setCurrentItem(item0);
}

这产生了我需要的东西:有一个类来保存与每个节点相关的属性值,并将它们呈现在QTableWidget 上。下一步是创建反向路径,这意味着,当QTableWidget 中发生编辑时,这些更改应该传播到类。现在我想我可以找到自己的方式,希望这可以帮助任何试图找到相关内容的人。我还将更新标签,并可能编辑标题以使其更相关/更有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多