【问题标题】:QT - Existing slot is not visible from mainwidow.cppQT - 从 mainwidow.cpp 看不到现有插槽
【发布时间】:2018-03-04 13:07:51
【问题描述】:

我需要做一些繁重的计算,所以我决定将它移到工作线程以避免 GUI 冻结。假设我有两个文件:mainwindow.cppcalc.cpp。两者都有头文件。从 GUI 收集一些用户输入,当用户按下按钮时,计算开始。这里有一个sn-p:

mainwindow.cpp

#include "calc.h"
Va = ui->lineEdit_Va->text().toDouble();
Vb = ui->lineEdit_Vb->text().toDouble();
//Progress bar definition
sender = new calc();
connect(sender, SIGNAL( inprogress(int) ), ui->progressBar, SLOT( setValue(int) ) );
//Calculation begins here
QThread* newThread = new QThread();
sender->moveToThread(newThread);
connect( newThread, SIGNAL(started()), sender, SLOT(transfer(Va, Vb)));
newThread->start();

calc.h

class calc : public QObject
{
    Q_OBJECT
public:
    calc(QObject *parent=0);
public slots:
    void transfer(double Va, double Vb);
signals:
    void inprogress(int progr);
};

虽然进度条连接工作正常,但connect( newThread, SIGNAL(started()), sender, SLOT(transfer(Va, Vb))); 似乎对于 qt 创建者是不可见的。它以错误结束:

QObject::connect: ../my-directory/mainwindow.cpp 中没有这样的插槽 calc::transfer(Va, Vb)

我认为这可能与旧的 moc 文件有关,但是我尝试清理构建,更改工作目录,甚至手动删除 moc 文件,但没有任何改变。那么问题来了,为什么这个 slot 在 mainwindow.cpp 中是不可见的,尽管它被设置为 public?

【问题讨论】:

  • 只是一般建议。远离基于字符串的信号/插槽连接(使用SIGNAL()SLOT() 宏的连接),而更喜欢使用编译时检查的指针到成员函数语法的新样式连接。它们更安全、更快捷。
  • 您需要指定 type 名称,而不是 SLOT 规范中的形式参数名称。所以SLOT(transfer(double, double))。请注意,如果您遵循@JesperJuhl 的建议,这几乎肯定会被编译器标记。
  • 也许我错过了插槽概念中的某些内容,但如果我这样做了:connect( newThread, &NewThread::started, sender, &Sender::transfer); 我将如何指定要与插槽一起传输的参数?
  • VaVb 在哪里? calc 可以访问它们吗?你不能像现在这样传递参数。
  • @drescherjm - 编辑了第一篇文章,包括 Va 和 Vb 定义。

标签: c++ qt signals-slots


【解决方案1】:

大概是这样的:

connect(newThread, &QThread::started,
        [=]() { sender->transfer(Va, Vb); });

【讨论】:

  • 似乎有道理。然而,NewThread 的声明是什么?结尾是:'NewThread' has not been declared connect(newThread, &NewThread::started,
  • 应该是QThread。我从评论中盲目复制/粘贴。已编辑。
  • 它有效。代码编译和计算如下。但是我不明白这种语法[=]() { sender->transfer(Va, Vb); });。只是出于竞争,这对我来说并不直观。
  • @Karls,它的 c++ Lambda
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 2013-06-05
相关资源
最近更新 更多