【问题标题】:How can I emit a signal from another class?如何从另一个类发出信号?
【发布时间】:2013-02-17 01:25:44
【问题描述】:

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

【问题讨论】:

  • LOW 是正确的对象类型吗?
  • 什么是 LOW?缺少一些代码来给你一个正确的分析。
  • LOW代表Log类——我在帖子中提到的内部类
  • 不确定moc 是否适合嵌套类定义。

标签: c++ qt qt4 signals-slots


【解决方案1】:

要了解问题,您必须了解信号是如何发出的:

它们只是一个非静态成员函数调用,因此需要调用一个实例(“发送者”)。通常,此实例为this(如果您从同一类的另一个非静态成员函数中发出信号),因此调用语法变为没有任何(文字)实例的普通函数调用. emit 关键字是可选的,它只是一个扩展为空的宏。以下四个版本写在包含信号的同一个类的成员函数中都是一样的:

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

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

emit someLogWriter->signalLogAppend("foo");

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

【讨论】:

  • 嗯...似乎这是逻辑解释:)我也尝试过这样想,但我使用了 ptr->emit signalLogAppend() ,在阅读您的帖子后看起来有点愚蠢 -好的,谢谢帮助!!!
  • 嗯,这很愚蠢,但我认为它也应该有效。因为它被扩展为ptr-> signalLogAppend()(注意空格),这应该是有效的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
  • 2019-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
相关资源
最近更新 更多