标题:事件和信号有什么区别?
作者:kevinlynx
日期:2006-07-02 23:38
内容:
例如对于一个 PushButton ,它有一个 clicked() 信号可以被发送,但是为什么不能把其作为一个事件来看待?
在windowsGUI 编程中,鼠标移动和按钮被按下都被作为消息来处理,为什么Qt 里有事件和信号两个机制? 他们之间的区别和联系是什么?
迷惑中。。。。
#1 [saga2006 07-03 17:55]
所谓的信号/槽机制是用moc工具转化为消息进行处理的, click当然是消息了,不过被qt给封装到signal/slot中罢了,个人理解,
#2 [kevinlynx 07-03 22:49]
那事件呢? 既然有了 slot and signal 机制,那要着事件还有什么用?
#3 [kytexzy 07-04 17:29]
这个问题有点高级。
个人认为Qt的‘信号/槽’是个通信机制,任何继承了QObject的对象都可以发出信号也可以接收信号做出响应,信源和信宿没有专门指定是那个对象;
而事件是个“报信”机制,它报告在Qt构件上发生了什么事情,只能由该构件对这个事件进行处理。
#4 [kevinlynx 07-05 02:28]
“而事件是个“报信”机制,它报告在Qt构件上发生了什么事情,只能由该构件对这个事件进行处理。
”
我们可以通过重载来自己处理事件啊。例如处理在窗体上右键单击事件:
void CMainWindow::contextMenuEvent(QContextMenuEvent *event)
{
QPopupMenu contextMenu(this);
contextMenu.insertItem( "NewF&ile", this, SLOT( NewFile() ) );
contextMenu.insertItem( "New&Project", this, SLOT( NewProject() ) );
contextMenu.insertItem( "&Open", this, SLOT( Open() ));
contextMenu.insertItem( "&Exit", this, SLOT( Exit() ));
contextMenu.exec(event->globalPos());
}
恩,尽管如此,大致区别还是明白了些。
#5 [hechuan 07-05 15:24]
我的理解:signal/slot是对象间同步通信机制,信号的释放过程是阻塞的,一定要等到槽函数返回后这个过程才结束。实际上信号释放时Qt是直接调用的槽函数。这实际上就是一般的对象相互间调用方法,只不过Qt的实现方式避免了对象间的耦合,更适合于组件编程。
而事件是一个异步的通信机制,事件产生时事件被放到队列里就继续执行下面的代码,是非阻塞的。这类似于Windows里的消息。
比如一个button的click()信号,它本身不是事件,它是在处理click button这个事件过程中产生的。
引用第2楼kevinlynx于2006-07-03 22:49发表的“”:
那事件呢? 既然有了 slot and signal 机制,那要着事件还有什么用?