Qt学习之路—–SIGNAL & SLOT

August 6th, 2013 by JasonLe's Tech Leave a reply »

今天学习了QtGUI与QThread结合的例子,写了一个发射信号量的记时程序。

.h
signals:
void NumberChanged(int);
.cpp
void MyThread::run()
{
this->stop = false;
for(;i<1000;i++)
{
QMutex mutex;
mutex.lock();
if(this->stop) break;
mutex.unlock();

emit NumberChanged(i);

this->msleep(100);
}
}

上面函数每次经过原子操作以后,都会emit一下,发射NumberChanged(i),其实这个NumberChanged(int)并没有定义,功能是发射一个int数字,emit就是相当与函数调用。然后

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui-&gt;setupUi(this);

mthread = new MyThread(this);
connect(mthread,SIGNAL(NumberChanged(int)),this,SLOT(onNumberChanged(int)));
}

然后需要实现SLOT函数onNumberChanged(int)

.h

public slots:
void onNumberChanged(int);

.cpp

void MainWindow::onNumberChanged(int Number)
{
ui-&gt;label-&gt;setText(QString::number(Number));
}

这样就可以把信号与槽函数链接在一起。(我总是觉得类似与windows的消息循环机制)

Qt支持如下信号-槽连接类型:
自动连接(默认)- 如果信号是从接收对象所在的线程发出的,其行为与“直接连接”相同。否则,其行为与“队列连接”相同。
直接连接- 当信号发出,槽会被立马调用。此槽在发出者的线程中执行,而不一定是接收者所在的线程。
队列连接- 当控制返回到接收者所在线程的事件循环时调用。槽在接收者的线程中执行。
阻塞的队列连接- 槽像“队列连接”那样被调用,除了一点:当前线程会阻塞住直到槽返回。注:在同一线程中使用此类型的连接将导致死锁!
唯一连接- 行为与“自动连接”相同,但连接必须在无复制品时才能建立。也就是,如果在相同的两个对象之间已经建立了同一个信号到同一个槽的连接,那么连接就不能建立,connect()返回false。

连接类型可以通过给connect()传递一个额外的参数来指定。注意当接收者和发送者位于不同的线程中时,使用“直接连接”,如果事件循环是运行于接收者的线程中,此时是不安全的,同理调用位于另外线程的对象的任何函数都是不安全的。

 

 

http://2.lizhaozhong.sinaapp.com/?p=328  例如这个异步服务器,我们看到使用的是队列连接。

 

另外我们要知道的是我们如果要从类中向类外发送signal………To be continue