我在QT框架中的工作信号和插槽有问题。 我的插槽没有用。 这是代码。
connect(&th,SIGNAL(change()),this,SLOT(closeWindow()));
this->moveToThread(th);
closeWindow();
th.start();
“th”是来自这样一个类的var:
class Thread : public QThread
{
public :
Thread();
bool pause,flag;
QString URL;
QFile *mFile;
void run();
void RESUME();
void PAUSE();
bool Check();
bool Check2();
signals:
void change();
QString myTxt;
};
“改变”是信号
这是我的MainWindow的代码:
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
Thread th;
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
public slots:
void closeWindow();
};
,这是MainWindow的构造函数
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(&th,SIGNAL(change()),this,SLOT(closeWindow()));
th.start();
}
信号正常。但是Slot没有工作。 你可以指导我吗?
答案 0 :(得分:1)
我认为主要问题是接收对象存在于死线程中。
您的Thread
实例存在于应用程序线程中,而您的MainWindow
存在于Thread
实例创建的线程上。但是,当您重新实现QThread::run()
时,您在此线程上没有事件循环,并且永远不会调用该插槽。
查看Qt文档以获取详细信息:
您的代码中也存在一些重大问题:
Thread
定义中缺少Q_OBJECT宏(但您可能在复制/粘贴时将其删除,否则您将无法发出信号)。moveToThread()
派生的对象上调用QWidget
(例如QMainWindow
)。 QWidgets必须存在于应用程序线程中。moveToThread()
混合并重新实现run()
。
moveToThread()
时,您正在使用线程事件循环来使QObject生活在此线程上(即移动到此线程)。QThread::run()
时,人们通常希望在线程上执行单个函数。这将导致创建一个线程,执行该函数并销毁线程而不运行事件循环。并且没有事件循环意味着如果QObject存在于该线程上,它将不会接收到线程间插槽调用。 注意:使用moveToThread()
是使用QThread
的正确/预期方式。重新实现QThread::run()
会有效,可以在Qt文档中找到,但通常不建议您使用QThreadPool
。
更多读数:http://blog.qt.io/blog/2010/06/17/youre-doing-it-wrong/