• 8972阅读
  • 7回复

事件和信号有什么区别? [复制链接]

上一主题 下一主题
离线kevinlynx
 

只看楼主 倒序阅读 楼主  发表于: 2006-07-02
例如对于一个 PushButton ,它有一个 clicked() 信号可以被发送,但是为什么不能把其作为一个事件来看待?
在windows GUI 编程中,鼠标移动和按钮被按下都被作为消息来处理,为什么Qt 里有事件和信号两个机制? 他们之间的区别和联系是什么?
  迷惑中。。。。
[ 此贴被XChinux在2006-07-03 21:33重新编辑 ]
离线saga2006
只看该作者 1楼 发表于: 2006-07-03
所谓的信号/槽机制是用moc工具转化为消息进行处理的, click当然是消息了,不过被qt给封装到signal/slot中罢了,个人理解,
离线kevinlynx

只看该作者 2楼 发表于: 2006-07-03
那事件呢? 既然有了 slot and signal 机制,那要着事件还有什么用?
离线kytexzy

只看该作者 3楼 发表于: 2006-07-04
这个问题有点高级。
个人认为Qt的‘信号/槽’是个通信机制,任何继承了QObject的对象都可以发出信号也可以接收信号做出响应,信源和信宿没有专门指定是那个对象;
而事件是个“报信”机制,它报告在Qt构件上发生了什么事情,只能由该构件对这个事件进行处理。
try to find forgiveness for yourself and forgive others
离线kevinlynx

只看该作者 4楼 发表于: 2006-07-05
“而事件是个“报信”机制,它报告在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());
}

恩,尽管如此,大致区别还是明白了些。
离线hechuan
只看该作者 5楼 发表于: 2006-07-05
我的理解:signal/slot是对象间同步通信机制,信号的释放过程是阻塞的,一定要等到槽函数返回后这个过程才结束。实际上信号释放时Qt是直接调用的槽函数。这实际上就是一般的对象相互间调用方法,只不过Qt的实现方式避免了对象间的耦合,更适合于组件编程。

而事件是一个异步的通信机制,事件产生时事件被放到队列里就继续执行下面的代码,是非阻塞的。这类似于Windows里的消息。

比如一个button的click()信号,它本身不是事件,它是在处理click button这个事件过程中产生的。

引用第2楼kevinlynx2006-07-03 22:49发表的“”:
那事件呢? 既然有了 slot and signal 机制,那要着事件还有什么用?
离线kevinlynx

只看该作者 6楼 发表于: 2006-07-05
引用第5楼hechuan2006-07-05 15:24发表的“”:
我的理解:signal/slot是对象间同步通信机制,信号的释放过程是阻塞的,一定要等到槽函数返回后这个过程才结束。实际上信号释放时Qt是直接调用的槽函数。这实际上就是一般的对象相互间调用方法,只不过Qt的实现方式避免了对象间的耦合,更适合于组件编程。
而事件是一个异步的通信机制,事件产生时事件被放到队列里就继续执行下面的代码,是非阻塞的。这类似于Windows里的消息。
比如一个button的click()信号,它本身不是事件,它是在处理click button这个事件过程中产生的。
.......


不错。。。有点道理了~~~~欢迎更多的人进来讨论,另外,Qt里好象有函数,用来发送事件(消息)的,分为是否等待处理完-----就象 Windows API 里的 SendMessage 和 PostMessage 一样~~一个等待处理完后返回,一个只发送而不管处理完与否就返回。。。
离线hechuan
只看该作者 7楼 发表于: 2006-07-05
确实有这两种函数,QApplication有两个发送事件的方法:postEvent ()和sendEvent(),对应Windows的PostMessage和SendMessage,分别是异步调用和同步调用。

引用第6楼kevinlynx2006-07-05 17:49发表的“”:
不错。。。有点道理了~~~~欢迎更多的人进来讨论,另外,Qt里好象有函数,用来发送事件(消息)的,分为是否等待处理完-----就象 Windows API 里的 SendMessage 和 PostMessage 一样~~一个等待处理完后返回,一个只发送而不管处理完与否就返回。。。
快速回复
限100 字节
 
上一个 下一个