【问题标题】:Q_EMIT not working from connected slot, only with QTimer slotQ_EMIT 不能从连接的插槽工作,仅适用于 QTimer 插槽
【发布时间】:2014-03-13 18:57:47
【问题描述】:

我正在尝试发出一个信号,如果插槽连接到QTimer,则该信号有效。但是,如果插槽连接到 QPushButton,例如,它就不起作用。例如,我有一个 run() 函数,它连接到一个 1 秒的 QTimer。 run() 函数包含 Q_EMIT textChanged("Test") 此信号按预期工作。但是,如果我有一个 QPushButton 连接到一个插槽,它还包含 Q_EMIT textChanged("Test") 什么都不会发生...为什么会这样???

#include <QApplication>
#include <QVBoxLayout>
#include <QPlainTextEdit>
#include <QTabWidget>
#include <QTimer>
#include <QPushButton>

class Counter : public QWidget
{
   Q_OBJECT
public:
   explicit Counter(QWidget *parent = 0) : QWidget(parent) {
      QTimer *timer = new QTimer(this);
      connect(timer, SIGNAL(timeout()), SLOT(run()));
      timer->start(1000);

      QVBoxLayout *layout = new QVBoxLayout(this);
      QPushButton *OK = new QPushButton("OK");
      connect(OK, SIGNAL(clicked()), SLOT(OKalarmLimits()));
      layout->addWidget(OK);
   }
   Q_SIGNAL void textChanged(const QString &text);
   Q_SLOT void run() { Q_EMIT textChanged("Run - Counter"); }
   Q_SLOT void OKalarmLimits() { Q_EMIT textChanged("Button Clicked"); }
};

class MainWindow : public QWidget {
   Q_OBJECT
   QPlainTextEdit *box;
public:
   explicit MainWindow(QWidget *parent = 0) : QWidget(parent) {
      QVBoxLayout * layout = new QVBoxLayout(this);

      box = new QPlainTextEdit();
      box->setMaximumHeight(400);
      box->setMinimumWidth(400);
      layout->addWidget(box);

      QTabWidget *tabWidget = new QTabWidget;
      tabWidget->addTab(new Counter(), tr("Counter"));
      layout->addWidget(tabWidget);

      QTimer *timer = new QTimer(this);
      connect(timer, SIGNAL(timeout()), SLOT(run()));
      timer->start(1000);
   }
   Q_SLOT void updateWidgets(const QString &t) { box->appendPlainText(t); }
   Q_SLOT void run() { box->appendPlainText("Run - Window"); }
};

int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   MainWindow s;
   Counter m;
   s.show();
   s.connect(&m, SIGNAL(textChanged(QString)), SLOT(updateWidgets(QString)));
   return a.exec();
}

#include "main.moc"

【问题讨论】:

  • 好吧,我添加了最小自包含示例。不,当我的代码在调试模式下运行时不会引发错误

标签: qt signals-slots


【解决方案1】:

这真的很容易。有两个不同的计数器,您连接到错误的计数器。

main() 中的Counter 实例,您连接的那个实例,从未显示(毕竟您不调用它的show() 方法!)。您需要连接到在此行中创建的实例:tabWidget-&gt;addTab(new Counter(), tr("Counter"));

一种解决方案是在MainWindow() 中进行连接:

 Counter * counter = new Counter();
 QObject::connect(counter, SIGNAL(textChanged(QString)), SLOT(updateWidgets(QString)));

 QTabWidget *tabWidget = new QTabWidget;
 tabWidget->addTab(counter, tr("Counter"));
 layout->addWidget(tabWidget,1,0);

这也说明了为什么最小的例子真的应该是最小的。如果您继续致力于最小化,您就会发现错误。本质上,您可以从main() 中删除下面的行,而不会改变行为:这将是一个死的赠品,您认为的计数器不是那个。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-18
    • 2022-07-21
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2016-03-11
    相关资源
    最近更新 更多