如何将 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:如何将委托模式与接口隔离(类与接口)一起使用?