连接 QTreeWidgetItem 时出错

Posted

技术标签:

【中文标题】连接 QTreeWidgetItem 时出错【英文标题】:Error when connecting a QTreeWidgetItem 【发布时间】:2013-09-27 14:31:19 【问题描述】:

我收到以下代码的编译错误。我不能对树项使用信号:

class MyClass : public QObject

    Q_OBJECT

public:
    int Grow();

public slots:
    void AddSubtree(QTreeWidgetItem *_jobItem, int _column);

private:
    void AddSubtree(QTreeWidgetItem *_jobItem, const QString &_filePath);
;

int MyClass::Grow()

    ...
    foreach(QFileInfo fileInfo, filesList)
    
        if(fileInfo.isDir())
        
            const QString tag = fileInfo.fileName();

            QTreeWidgetItem* item = new QTreeWidgetItem();
            item->setText(0, tag);

            // This works, but it is performance critical! Do it on demand
            //AddRunSubtree(item, fileInfo.filePath());

            // Load this tag's subtree on demand when clicked (error on this line)
            QObject::connect(item, SIGNAL(itemClicked(QTreeWidgetItem*, int col)),
                             this, SLOT(AddSubtree(QTreeWidgetItem*, int col)));

            parentItem->addChild(item);
        
    


void MyClass::AddSubtree(QTreeWidgetItem *_jobItem, int _column)

    //...


void MyClass::AddSubtree(QTreeWidgetItem *_jobItem, const QString &_filePath)

    //...

我收到此编译时间错误:

error: no matching function for call to 'MyClass::connect(QTreeWidgetItem*&, const char*, MyClass* const, const char*)'

Candidates are:

c:\Qt\4.8.5\src\corelib\kernel\qobject.h:204: static bool QObject::connect(const QObject*, const char*, const QObject*, const char*, Qt::ConnectionType)
c:\Qt\4.8.5\src\corelib\kernel\qobject.h:204: note:   no known conversion for argument 1 from 'QTreeWidgetItem*' to 'const QObject*'

c:\Qt\4.8.5\src\corelib\kernel\qobject.h:217: static bool QObject::connect(const QObject*, const QMetaMethod&, const QObject*, const QMetaMethod&, Qt::ConnectionType)
c:\Qt\4.8.5\src\corelib\kernel\qobject.h:217: note:   no known conversion for argument 1 from 'QTreeWidgetItem*' to 'const QObject*'

c:\Qt\4.8.5\src\corelib\kernel\qobject.h:337: bool QObject::connect(const QObject*, const char*, const char*, Qt::ConnectionType) const
c:\Qt\4.8.5\src\corelib\kernel\qobject.h:337: note:   no known conversion for argument 1 from 'QTreeWidgetItem*' to 'const QObject*'

查看 QTreeWidgetItem 的定义,它实际上并不是从 QObject 派生的。这是否意味着我无法使选择树枝产生信号?

如果可能,我的代码有什么问题?

为什么错误消息包含 'MyClass::connect' 而不是 'QObject::connect'?

平台: Qt 4.8.5 MinGW/g++ 视窗 7

【问题讨论】:

【参考方案1】:

QTreeWidgetItem 不继承自 QObject,因此不支持信号/槽。

void itemClicked(QTreeWidgetItem*, int) 是来自QTreeWidget 的信号,所以你需要这样做:

QObject::connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(AddSubtree(QTreeWidgetItem*, int)));

还有一个小提示 - 您只需创建一次此连接(在构造函数中),而不是在每次添加项目时。

【讨论】:

我按照你写的做了,编译时错误消失了。但是,在运行时,永远不会调用 SLOT。为了确定这一点,我在其实现中添加了一个exit(1),但没有任何效果。 树小部件中有任何项目吗? itemClicked 信号仅在用户单击项目时发出。【参考方案2】:

您为连接的发送者使用了错误的类。您正在使用一个项目,而您应该使用 QTableWidget 本身。

如果你切换到那个,并且你设置了一次连接,你的插槽将被调用。

【讨论】:

以上是关于连接 QTreeWidgetItem 时出错的主要内容,如果未能解决你的问题,请参考以下文章

更改 QTreeWidgetItem 标志时防止递归

仅使 QTreeWidgetItem 的一列可编辑

QTreeWidgetItem 使用键盘多选

如何将 QTableWidget 添加到 QTreeWidget 但作为 QTreeWidgetItem

7.6.3 QTreeWidgetItem类函数介绍

QTreeWidgetItem清空子节点