2014-04-18 95 views
3

假設我有一個包含「function()」的字符串,其中function()是類中的一個插槽,我想用任何信號連接該插槽,但使用該字符串。無論Qt連接沒有SLOT宏

QString f="function()"; 
connect (randomobject, SIGNAL(randomsignal()), this, SLOT(f)); 

output: just says that slot f doesn't exist. 

QString f="SLOT(function())"; 
//conversion to const char* 
connect (randomobject, SIGNAL(randomsignal()), this, f); 
output: Use the SLOT or SIGNAL macro to connect 

工作。

有沒有辦法做類似的事情?重要的是它是一個字符串而不是函數指針。

+1

你檢查了SLOT宏的實現嗎? –

+0

你正在收到什麼錯誤? – Samer

+0

是的,我知道SLOT基本上將括號中的內容轉換爲字符串。我用輸出更新了答案。 – rndm

回答

4

您可以qobjectdefs.h檢查出SLOT的定義:

#ifndef QT_NO_DEBUG 
# define SLOT(a)  qFlagLocation("1"#a QLOCATION) 
# define SIGNAL(a) qFlagLocation("2"#a QLOCATION) 
#else 
# define SLOT(a)  "1"#a 
# define SIGNAL(a) "2"#a 
#endif 

這意味着SLOT( 「FUNC()」)簡單地轉換爲 「1func()」 經過預處理。 所以你可以這樣寫:

Test *t = new Test; // 'Test' class has slot void func() 
QString str = "func()"; 

QPushButton *b = new QPushButton("pressme"); 
QObject::connect(b, SIGNAL(clicked()), t, QString("1" + str).toLatin1()); // toLatin1 converts QString to QByteArray 

當你告訴按鈕,按下它,從測試槽FUNC()將被調用。請注意'connect'需要'const char *'作爲第二個和第四個參數類型,因此您必須將QString轉換爲'const char *'或'QByteArray'(將轉換爲char指針)。

+0

按預期工作。謝謝! – rndm

+1

這個答案泄漏指針,即: QPushButton * b = new QPushButton(「pressme」);沒有獲得父級,並且Test類沒有父級,也沒有智能指針。 – lpapp

+0

@Ipapp儘管我不得不說,雖然不完整(作者從未提及他提供了一個完整的工作示例),但您可以很高興地添加缺失的部分,但它說明事情如何在OP的要求方面發揮作用。 – rbaleksandar