2013-09-27 36 views
1

我收到以下代碼的編譯錯誤。我無法與樹項目使用信號:連接QTreeWidgetItem時出錯

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 /克++
視窗7

回答

1

您對連接的發件人使用了錯誤的類。您正在使用一個項目,而您應該使用QTableWidget本身。

如果切換到該狀態,並且您設置連接一次,您的插槽將被調用。

2

QTreeWidgetItem不繼承QObject,所以這意味着它不不支持信號/插槽。

void itemClicked(QTreeWidgetItem*, int)QTreeWidget的信號,所以你需要做這種方式:

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

而且小記 - 你只需要一次(在構造函數)創建這個連接不上的每一個項目的補充。

+0

我做了你寫的東西,並且編譯時錯誤消失了。但是,在運行時,SLOT永遠不會被調用。爲了確保這一點,我在其執行中放了一個'exit(1)',但沒有任何效果。 – Pietro

+0

你有沒有在樹中的任何項目?只有當用戶點擊該項目時,纔會發出'itemClicked'信號。 – Johny