我如何从另一个班级发出信号?

时间:2013-03-02 16:01:36

标签: c++ qt qt4 signals-slots

我的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);

1 个答案:

答案 0 :(得分:43)

要了解问题,您必须了解信号的发射方式:

它们只是一个非静态成员函数调用,因此需要调用实例(“发送者”)。通常,此实例为this(如果从同一类的另一个非静态成员函数中发出信号),则调用语法将成为正常的函数调用,而不是任何(字面值) )实例。 emit关键字是可选的,只是一个扩展为空的宏。当写入包含信号的同一类的成员函数时,以下四个版本都是相同的:

emit this->signalLogAppend("foo");
emit signalLogAppend("foo");
this->signalLogAppend("foo");
signalLogAppend("foo");

如果从内部类中发出外部类的信号,则this指针引用内部类的实例,因此外部类缺少某些实例。它就像在内部类中调用外部类的任何其他函数一样:编译器不知道在哪个(外部类的)对象实例上调用它。所以你必须写一些类似的东西:

emit someLogWriter->signalLogAppend("foo");

此处,someLogWriter是您要为其发出信号的LogWriter实例。