簡體   English   中英

我如何從另一個班級發出信號?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM