C++ 如何从另一个类发出信号?

C++ 如何从另一个类发出信号?,c++,qt,qt4,signals-slots,C++,Qt,Qt4,Signals Slots,我的Qt应用程序有问题。我试图从另一个类中发出信号(它是信号所在类的嵌套类) 我已经用插槽连接了信号,应该没问题。但是当我试图从这个嵌套类中发出这个信号时,我得到了编译器错误: 无法在没有对象的情况下调用成员函数 怎么了?我在Qt文档中查找了这个问题,但找不到合理的解决方案,甚至找不到解释 简化的类定义如下所示 class LogWriter : public QDialog { Q_OBJECT public: class Log : public QObject {

我的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");
如果从内部类发出外部类的信号,
指针引用内部类的实例,因此外部类缺少一些实例。这与从内部类调用外部类的任何其他函数一样:编译器不知道在哪个对象实例(外部类的)上调用它。所以你必须写一些类似的东西:

emit someLogWriter->signalLogAppend("foo");

这里,
someLogWriter
是要为其发出信号的
LogWriter
的实例。

LOW
对象的正确类型吗?什么是LOW?缺少一些代码来为您提供正确的分析。LOW表示日志类-我在POST中提到的内部类不确定
moc
是否能很好地处理嵌套类定义。Hm。。。似乎这是逻辑解释:)我也试着这样想,但我使用了ptr->emit signalLogAppend(),读了你的帖子后,它看起来有点愚蠢-好的,谢谢你的帮助!!!嗯,这很愚蠢,但我认为它也应该起作用。因为它被扩展为
ptr->signalLogAppend()
(注意空格),所以应该是有效的。