2

我正在使用 Qt 库(4.8 版)开发应用程序。

我有一个带有 QStandardItemModel 的 QTreeView。我的小部件看起来像这样:

项目1

分项 11

分项 12

项目2

子项 21

子项22

第 3 项

子项 31

子项 32

这是我将项目添加到 QTreeView 的方法:

 model->setItem(0, 0, item1); 
 item1->setChild(0, 0, subitem12);

我只想在用户双击一个项目时采取行动(当他点击一个子项目时什么都不做)。所以我使用 doubleClicked(const QModelIndex & index)信号。

我想处理用户双击的项目/子项目的信息。所以我得到了我的项目/子项目的行:

index.row();

但是每次我尝试引用项目/子项目以显示其名称或检查它是否有子项时,我只能访问这些项目:

index.model()->item(row)->text();

我的问题是:如何访问我的插槽中的子项(vbetween items abd subitems)?或者我怎样才能阻止他们发出信号?我不能禁用它们——这对用户来说太混乱了。

编辑:问题是每次我点击一个项目或子项目并执行:

index.model()->item(row)->hasChildren();

或者:

index.model()->item(row)->parent() == 0;

我得到了真实的结果。所以我只能参考这些项目。

我的问题是:引用子项的正确方法是什么?

4

3 回答 3

2

当您尝试按行索引访问模型项时,模型会返回该行的顶级项。改用itemFromIndex

auto item = index.model()->itemFromIndex(index);
if (item && item->hasChildren()){
    // item is not a leaf
}

EDIT index.model()返回QAbstractItemModel*,因此这里也需要强制转换(或者,更好的是,在代码中存储指向标准模型的指针)。

于 2016-02-24T20:46:23.863 回答
1

我会这样做:

// Define your custom role to store item type.
enum MyRoles
{
    ItemTypeRole = Qt::UserRole + 1
};

// Define item types.
enum ItemType
{
    Primary,
    Secondary
};

比为所有项目设置正确的项目类型:

QStandardItem* item = new QStandardItem("Item1");
item->setData(Primary, ItemTypeRole);

QStandardItem* subItem = new QStandardItem("SubItem1");
subItem->setData(Secondary, ItemTypeRole);

在连接到doubleClicked信号的插槽中访问如下类型:

ItemType type = static_cast<ItemType>(index.data(ItemTypeRole).toInt());
if (type == Primary)
    std::cout << "It's a Primary item!" << std::endl;
else if (type == Secondary)
    std::cout << "It's a Secondary item!" << std::endl;
于 2016-02-25T08:14:00.337 回答
0

You can't disable the signal for the subitems. However, you can check if an item has a parent. It it doesn't, it is an item and if it does, it's a subitem.

if (item->parent() != 0)
   .. //subitem
else
   .. //item

An alternative would be to use the data() function to set some special value to distinguish between the two.

item1->setData(QVariant("item"));
subitem1->setData(QVariant("subitem"));

Then query the value in your doubleclick handler:

QVariant var = item->data();
if (var.toString() == "item")
  ...
else if (var.toString() == "subitem")
  ...
于 2016-02-24T18:15:29.843 回答