qt里面的事件与信号问题

碎炎 2011-06-02 03:47:31
自学几天,碰到个概念的问题
假如我重写了一个myLabel类,继承QLabel,重写了它的mousePressEvent(QMouseEvent *)
然后写了一个继承了QMainWindow的类,里面放了一个myLabel,一个QPushButton
运行后,我点击myLabel,生成的QMouseEvent是被QMainWindow::QObject::event()接收了
还是被myLabel对象里的那个函数给接收了?
...全文
167 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
碎炎 2011-06-04
  • 打赏
  • 举报
回复
有点儿明白了 就是accept还是不大明白
碎炎 2011-06-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dbzhang800 的回复:]
引用 4 楼 sryan 的回复:

引用 3 楼 mankeyaq 的回复:
在被点击时,如果控件没有重载mousePressEvent的话,消息还是会被传给父对象,如果有的话就不传给父对象了

好像QWidget里面都有mousePressEvent 都传给自己了

1. 这不叫重载(overload),这叫覆盖(override)
2. 这儿描述的现象属于Qt事件系统的“事件……
[/Quote]
明白 就是重写了虚函数
下面的帖子我去看看
dbzhang800 2011-06-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sryan 的回复:]

引用 3 楼 mankeyaq 的回复:
在被点击时,如果控件没有重载mousePressEvent的话,消息还是会被传给父对象,如果有的话就不传给父对象了

好像QWidget里面都有mousePressEvent 都传给自己了
[/Quote]
1. 这不叫重载(overload),这叫覆盖(override)
2. 这儿描述的现象属于Qt事件系统的“事件转发” (event propagation)
可以参考 http://hi.baidu.com/cyclone/blog/item/fe6ab3de0e9f2155ccbf1aea.html

事件转发的规则也很简单,取决于event是否被 filter 或 accept
wusq_2007 2011-06-03
  • 打赏
  • 举报
回复
学习中,好像我也发现了类似的问题。
碎炎 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mankeyaq 的回复:]
在被点击时,如果控件没有重载mousePressEvent的话,消息还是会被传给父对象,如果有的话就不传给父对象了
[/Quote]
好像QWidget里面都有mousePressEvent 都传给自己了
TwilightSun 2011-06-02
  • 打赏
  • 举报
回复
在被点击时,如果控件没有重载mousePressEvent的话,消息还是会被传给父对象,如果有的话就不传给父对象了
碎炎 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hzy6813863 的回复:]
你可以尝试在myLabel中的mousePressEvent增加一些打印或者其他动作,看看有没有被执行。
我感觉应该是QMainWindow::QObject::event()接受了,不过不知道能不能设置一下,让myLabel中的mousePressEvent接受。
[/Quote]

class MyLabel:public QLabel
{
public:
void mousePressEvent(QMouseEvent *ev);
};
void MyLabel::mousePressEvent(QMouseEvent *ev)
{
//QMessageBox::information(NULL,"USE","Now Working!");
this->setText(QString("<center><h1>Move: (%1, %2)</h1></center>")
.arg(QString::number(ev->x()), QString::number(ev->y())));

}


class mWindow:public QMainWindow
{
private:
MyLabel *mlabel;
QPushButton *pButton;
protected:
void mousePressEvent(QMouseEvent *ev){
this->mlabel->mousePressEvent(ev);
}

public:
mWindow(QWidget *parent=0):QMainWindow(parent){
mlabel=new MyLabel;
mlabel->setText("hello");
pButton=new QPushButton;
pButton->setText("Hello");
QHBoxLayout a;
QToolBar *tool=this->addToolBar("D");
tool->addWidget(pButton);
this->statusBar()->addWidget(mlabel);
}
};

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

mWindow w;
w.show();

return a.exec();
}


我写了一段代码验证
得出的结论是点击某个部件,那么产生的event对象就作为参数传送到某个部件内的QObject::event(QEvent *)
那么就是说我点击了myLabel的话,作为event函数的分配结果就是运行myLabel内的响应函数
如果点击pButton的话 就没有显示鼠标坐标的效果了 为了验证我特意把QMainWindow的鼠标点击响应的event参数给了myLabel了
所以点击谁 事件就传给谁
文森特houzy 2011-06-02
  • 打赏
  • 举报
回复
你可以尝试在myLabel中的mousePressEvent增加一些打印或者其他动作,看看有没有被执行。
我感觉应该是QMainWindow::QObject::event()接受了,不过不知道能不能设置一下,让myLabel中的mousePressEvent接受。

16,213

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧