具有 QTreeWidgetItem 派生项作为项目的 QTreeWidget 的处理信号

Processing signal of QTreeWidget that has QTreeWidgetItem derivitives as items

我没有找到解决这个问题的合适方法,所以我希望有人能给我一个问题的答案:

我使用的是普通 QTreeWidget,但作为项目,我使用 QTreeWidgetItem 自己的子类(因为我需要在项目中存储一些其他信息)。现在我想通过 QTreeWidget 使用 itemClicked() 信号,但我认为我的插槽没有收到任何信号,我认为它与 itemClicked() 的签名有关,因为它发送了一个 QTreeWidgetItem,当然不是我的自己的子类。

QTreeWidget 是否可能检测不到对我自己的子类项目的点击?

这是我的连接:

connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *)), this, SLOT(displayTransformData(QTreeWidgetItem*)));

这是我的位置:

void GUI::displayTransformData(QTreeWidgetItem* item) {

cout << "test" endl;    

Q_actorTreeWidgetItem* actor_item = dynamic_cast<Q_actorTreeWidgetItem*>(item);
vtkSmartPointer<vtkActor> actor =
    vtkSmartPointer<vtkActor>::New();
actor = actor_item->getActorReference();
double* position = new double[3];
position = actor->GetOrigin();

x_loc->setText(QString(std::to_string( position[0]).c_str() ));

}

我已经在尝试将我可以从信号中获得的项目转换为我自己的子类,但是槽函数从未被调用,因为来自我的 cout 行的测试没有出现在控制台中。

非常感谢您的每一次帮助!

问题是您的 SIGNAL 规格不正确,

SIGNAL(itemClicked(QTreeWidgetItem *))

您应该会在控制台看到一条警告消息,内容如下:

QObject::connect: No such signal tree_widget::itemClicked(QTreeWidgetItem *) in ...

根据documentation,实际信号规格是

void QTreeWidget::itemClicked(QTreeWidgetItem *item, int column)

因此,使用您需要的旧 Qt4 语法

connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)),
        this, SLOT(displayTransformData(QTreeWidgetItem*)));

但是,如果可能,您应该使用较新的 Qt5 signal/slot syntax

connect(treeWidget, &QTreeWidget::itemClicked, this, &GUI::displayTransformData);