gpt4 book ai didi

c++ - Qt 信号和槽混淆

转载 作者:行者123 更新时间:2023-12-03 12:50:56 31 4
gpt4 key购买 nike

我一直在阅读有关 Qt 信号和插槽的内容,并且正在尝试使其发挥作用,但到目前为止还没有成功。我希望有人能指出我正确的方向。
我有两个文件,homeCommand.cppmessagelogcommand.cpp。我在 messagelogcommand.cpp 中有一个 QPlainTextEdit 对象,我想从 homeCommand.cpp 更新该对象。
如何使用信号和槽来做到这一点?我的信号正在被调用,因为我的 QDebug 每秒打印一次,但是小部件不会更新。

这就是我正在尝试做的事情:

在 MessageLogCommand.h 中

class MessageLogCommand : public QWidget
{
Q_OBJECT
public:
explicit MessageLogCommand(QWidget *parent = 0);

QLabel *homeLabel;
QPlainTextEdit *messageLog;

public Q_SLOTS:
void updateWidgets(const QString &text);

};

homeCommand.h

class homeCommand : public QWidget
{
Q_OBJECT

Q_SIGNALS:
void textChanged(const QString &text);

public:
explicit homeCommand(QWidget *parent = 0);

public slots:
void run(void);
void getHealthStatusPacket(void);

homeCommand.cpp

homeCommand::homeCommand(QWidget *parent) : QWidget(parent)
{
...
//Timer
QTimer *timer = new QTimer(this);
timer->setSingleShot(false);
connect(timer, SIGNAL(timeout()), this, SLOT(run()));
timer->start(1000);

setLayout(layout);
}

void homeCommand::run(void)
{
getHealthStatusPacket();
}

void homeCommand::getHealthStatusPacket(void)
{
...
Q_EMIT textChanged("ZOMG");
}

在MessageLogCommand.cpp中

 MessageLogCommand::MessageLogCommand(QWidget *parent) : QWidget(parent)
{

QGridLayout *layout = new QGridLayout;
QWidget::setFixedHeight(600);

//Sub-system Label
homeLabel = new QLabel("GSS Message Log");
QFont subsystemFont = homeLabel->font();
subsystemFont.setPointSize(12);
subsystemFont.setBold(true);
homeLabel->setFont(subsystemFont);
layout->addWidget(homeLabel, 0, 0);

//Event Log
messageLog = new QPlainTextEdit();
messageLog->setFixedHeight(500);
messageLog->setFixedWidth(600);
layout->addWidget(messageLog, 2,0);

setLayout(layout);
}

void MessageLogCommand::updateWidgets(const QString &text)
{
qDebug() << "Here";
messageLog->appendPlainText(text);
}

在main.cpp中

MessageLogCommand s;
homeCommand m;

QObject::connect(&m, SIGNAL(textChanged(QString)), &s, SLOT(updateWidgets(QString)));

最佳答案

一个非常基本的例子是:

class MainClass:public QObject    //class must be derived from QObject!
{
Q_OBJECT //this macro must be in the class definition
//so the moc compiler can generate the necessary glue code

public:
void doSomething() {
...
Q_EMIT textChanged(someText);
}

Q_SIGNALS:
void textChanged(const QString &text);
};

class SubClass:public QObject
{
Q_OBJECT

public Q_SLOTS:
void onTextChanged(const QString &text) { //do not inline
//do something
}
};

int main()
{
QApplication a;

MainClass m;
SubClass s;
QObject::connect(&m, SIGNAL(textChanged(QString)),
&s, SLOT(onTextChanged(QString))); //const and & are removed from
//the arguments

return a.exec(); //run the event loop
}

所以,有两件事很重要:1.信号和槽必须在从QObject派生的类中声明2.包含信号和槽声明的类必须在类声明中添加Q_OBJECT宏

为了保持简单:始终在头文件中声明包含信号或槽的类(切勿在 .cpp 文件中)。

关于c++ - Qt 信号和槽混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21196287/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com