如何将 itemExpanded 与 QTreeWidgetItem 的子类一起使用

Posted

技术标签:

【中文标题】如何将 itemExpanded 与 QTreeWidgetItem 的子类一起使用【英文标题】:How to used itemExpanded with a subclass of QTreeWidgetItem 【发布时间】:2015-03-03 05:06:15 【问题描述】:

我确实有与 Qt/C++ 中使用的 SIGNAL/SLOT 相关的连接

我使用 QTreeWidget + QTreeWidgetItems 编写了一个应用程序。为了应用程序的需要,我不得不将 QTreeWidgetItem 子类化为 MyQTreeWidgetItem 以添加一些参数。

由于我从 QTreeWidgetItem 类移动到 MyQTreeWidgetItem 类,

connect(this, SIGNAL(itemExpanded(MyQTreeWidgetItem*)),
                 this, SLOT(onSubTreeDisplay(MyQTreeWidgetItem*)));

不再工作了。

问题是

QObject::connect: No such signal PulsTreeWidget::itemExpanded(MyQTreeWidgetItem*) in ../puls_connect/pulstreewidget.cpp:33

我认为问题在于 itemExpanded 期望 QTreeWidgetItem 而不是 MyQTreeWidgetItem。但是如果我用 QTreeWidgetItem 替换 MyQTreeWidgetItem 例如

connect(this, SIGNAL(itemExpanded(QTreeWidgetItem*)),
                 this, SLOT(onSubTreeDisplay(MyQTreeWidgetItem*)));

运行抱怨SIGNAL/SLOT没有相同的类型,这很正常。

我的项目是通过 MyQTreeWidgetItem 而不是 QTreeWidgetItem 定义的,因为我有它的子类。

连接在 QTreeWidget 部分完成 有什么想法吗?

谢谢

【问题讨论】:

【参考方案1】:

你可以像下面那样做信号槽连接

connect(this, SIGNAL(itemExpanded(QTreeWidgetItem*)), this, SLOT(onSubTreeDisplay(QTreeWidgetItem*)));

然后在onSubTreeDisplay() 内部,将QTreeWidgetItem 参数动态转换为MyQTreeWidgetItem,如下所示

void onSubTreeDisplay(QTreeWidgetItem* item)

    MyTreeWidgetItem* myItem = dynamic_cast<MyTreeWidgetItem*>(item);
    if (myItem)
    
        //cast is successful. you can use myItem
    

【讨论】:

谢谢。它是如何工作的?我收到 QTreeWidgetItem *item 以及如何动态转换它。不好意思问。我是 C++/Qt 的新手 即使您收到 QTreeWidgetItem 指针,如果您将 MyTreeWidgetItem 插入树小部件,它实际上指向一个 MyTreeWidgetItem 对象。因此,您可以将 QTreeWidgetItem 指针动态转换为 MyTreeWidgetItem 指针。

以上是关于如何将 itemExpanded 与 QTreeWidgetItem 的子类一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Swinject:如何将委托模式与接口隔离(类与接口)一起使用?

如何将 'afterColumnResize' 事件与 'rhandsontable' 一起使用?

如何将 Quickblox 与 angularjs 集成?

如何将手表与 iPhone 连接

如何将两个整数与 Twisted 相加?

如何将 Celery 与 asyncio 结合使用?