lag*_*oru 28 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);
};
Run Code Online (Sandbox Code Playgroud)
我LOW
使用以下函数调用将客户端代码中LogWriter 实例的信号连接到某个插槽:
connect(&LOW, SIGNAL(signalLogAppend(QString)),
this, SLOT(appendText(QString&)),
Qt::DirectConnection);
Run Code Online (Sandbox Code Playgroud)
lee*_*mes 44
要了解问题,您必须了解信号的发射方式:
它们只是一个非静态成员函数调用,因此需要调用实例("发送者").通常,此实例是this
(如果从同一类的另一个非静态成员函数中发出信号),则调用语法将成为没有任何(文字)实例的正常函数调用.该emit
关键字是可选的,仅仅是其扩展到任何一个宏.当写入包含信号的同一类的成员函数时,以下四个版本都是相同的:
emit this->signalLogAppend("foo");
emit signalLogAppend("foo");
this->signalLogAppend("foo");
signalLogAppend("foo");
Run Code Online (Sandbox Code Playgroud)
如果从内部类中发出外部类的信号,则this
指针引用内部类的实例,因此外部类缺少某个实例.它就像在内部类中调用外部类的任何其他函数一样:编译器不知道在哪个(外部类的)对象实例上调用它.所以你必须写下这样的东西:
emit someLogWriter->signalLogAppend("foo");
Run Code Online (Sandbox Code Playgroud)
这someLogWriter
是LogWriter
您要发出信号的实例.