信号和插槽QT

时间:2013-04-25 09:12:33

标签: c++ multithreading qt signals

我现在已经提出了一些关于程序中一个主要问题的所有问题,但仍然没有解决它,我使用线程来阻止我的UI锁定,但基本上它仍然可以,因为显然你可以在线程中做UI内容。

所以我被告知使用自定义信号和插槽(不是给出任何示例)。

所以从我读过的文档中我得出了这段代码:

·H

signals:

void paint_signal(double x, double y);

的.cpp

  connect(this,SIGNAL(paint_signal(double x, double y)), this, SLOT(PaintSomething(x,y)));

Paintsomething函数与所有这些函数在同一个类中....

主题:

*future2 = QtConcurrent::run(this, &GUI::paintAll);

paint all发出paint_signal并传递2个双打

emit paint_signal(x, y);

但是我得到了这个我根本不理解的错误

 connect: No such signal GUI::paint_signal(double x, double y)

2 个答案:

答案 0 :(得分:4)

connect(this,
        SIGNAL(paint_signal(double, double)), 
        this, 
        SLOT(PaintSomething(x,y)));

删除参数名称,它应该有效。如果这个不起作用,那么这个:

    connect(this,
        SIGNAL(paint_signal(double, double)), 
        this, 
        SLOT(PaintSomething(double,double)));

请告诉我这是否适合您:)

<强>更新

这个想法是你不能在线程中使用UI,而是从线程向UI发出信号。因为这个答案可能会让你回到起点(可能是一个新问题),这里是一个如何从线程发出信号的工作示例:

QT Signals to UI in a thread

答案 1 :(得分:1)

Floris Velleman的答案是肯定的,但是通过使用new signal slot syntax,您可以在编译期间捕获错误并摆脱冗余的限制。

旧语法:

connect(this,
        SIGNAL(paint_signal(double, double)), 
        this, 
        SLOT(PaintSomething(double,double)));

新语法:

connect(this,
        &SenderClass::paint_signal, 
        this, 
        &ReceiverClass::PaintSomething);