[英]How can I emit a signal from another class?
我的Qt應用程序有問題。 我正試圖從另一個類中發出一個信號(它是放置信號的嵌套類)。
我已經將信號連接到一個插槽,應該沒問題。 但是當我嘗試從這個嵌套類中發出這個信號時,我得到編譯器錯誤:
沒有對象就無法調用成員函數
怎么了? 我在Qt文檔中找到了它,但找不到合理的解決方案甚至解釋。
簡化的類定義如下所示。
class LogWriter : public QDialog
{
Q_OBJECT
public:
class Log : public QObject
{
Q_OBJECT
public:
bool print;
Log(bool _print, QString _color, QObject *obj = NULL)
: QObject(obj)
{
print = _print;
color = _color;
}
};
LogWriter(QWidget * parent = 0);
~LogWriter();
public slots:
void setMinVal();
void setMediumVal();
void setHighVal();
void cleanWindow();
void appendText(QString &text);
signals:
void signalLogAppend(QString);
};
我使用以下函數調用將客戶端代碼中LogWriter的實例LOW
的信號連接到某個插槽:
connect(&LOW, SIGNAL(signalLogAppend(QString)),
this, SLOT(appendText(QString&)),
Qt::DirectConnection);
要了解問題,您必須了解信號的發射方式:
它們只是一個非靜態成員函數調用,因此需要調用實例(“發送者”)。 通常,此實例是this
(如果您從同一個類的另一個非靜態成員函數中發出信號),那么調用語法將成為沒有任何(文字)實例的正常函數調用。 emit
關鍵字是可選的,只是一個擴展為空的宏。 當寫入包含信號的同一類的成員函數時,以下四個版本都是相同的:
emit this->signalLogAppend("foo");
emit signalLogAppend("foo");
this->signalLogAppend("foo");
signalLogAppend("foo");
如果從內部類中發出外部類的信號,則this
指針引用內部類的實例,因此外部類缺少某些實例。 它就像在內部類中調用外部類的任何其他函數一樣:編譯器不知道在哪個(外部類的)對象實例上調用它。 所以你必須寫下這樣的東西:
emit someLogWriter->signalLogAppend("foo");
這里, someLogWriter
是要為其發出信號的LogWriter
實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.