关于QT重载鼠标事件的一些问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于QT重载鼠标事件的一些问题相关的知识,希望对你有一定的参考价值。
现在我有两个相同的控件,都重载了 mousepress mousemove mouserelease事件。现在我想press一个控件的时候,两个控件都能移动。 也就是说需要一个方法,不需要主动点击鼠标,就已经触发了press事件,这个时候鼠标这要移动就可以move了。
参考技术A class A:public QWidget;class B:public QWidget;
....
A* a;
B* b;
void A::mousePressEvent(QMouseEvent* e)
//do something;先做你需要做的工作
//发现这个事件被处理了的,那就是B处理的,B直接调用了A的这个函数
if(e->isAccepted())
return;
//如果没被处理,那就是系统的事件到来,自己先处理,然后传给B,B收到一个处理了的事件,就不再传给A了;这样避免递归死循环
else
e->accept();
b->mousePressEvent(e);
void B::mousePressEvent(QMouseEvent* e)
//do something;
//同样的道理
if(e->isAccepted())
return;
else
e->accept();
a->mousePressEvent(e);
//releaseEvent也一样
moveEvent也一样,但都需要注意,如果用要坐标,那么直接调用的值到另一个UI需要转换追问
不好意思啊没怎么看懂 我直接说我要做的是什么吧
Qt Graphics Scene鼠标事件传播
【中文标题】Qt Graphics Scene鼠标事件传播【英文标题】:Qt Graphics Scene mouse event propagation 【发布时间】:2010-04-11 17:10:24 【问题描述】:您好,我正在学习 qt,我正在执行以下操作以将一些小部件添加到图形场景中
void MainWindow::addWidgets(QList<QWidget *> &list, int code)
if(code == CODE_INFO)
QWidget *layoutWidget = new QWidget();
QVBoxLayout *layout = new QVBoxLayout();
foreach(QWidget *w, list)
layout->addWidget(w);
this->connect(((ProductInfo*)w), SIGNAL(productClicked()), this, SLOT(getProductDetails()));
layoutWidget->setLayout(layout);
this->scene->addWidget(layoutWidget);
我的 ProductInfo 类处理鼠标释放并发出信号
void ProductInfo::mouseReleaseEvent(QMouseEvent *e)
QWidget::mouseReleaseEvent(e);
emit productClicked();
问题是在将小部件添加到场景后,它们不再获得鼠标释放事件并且不发出 productClicked 信号,但是如果我将它们添加到主窗口(而不是场景),它们会按预期工作。我做错了什么?
【问题讨论】:
【参考方案1】:如果添加 mousePressEvent 事件处理程序并在那里为事件对象调用 accept(),我相信您应该能够通过 QGraphicsScene 将 mouseReleaseEvent 发送到您的小部件。嗯。像这样:
void ProductInfo::mousePressEvent(QMouseEvent* event)
QWidget::mousePressEvent(event);
event->accept();
希望这会有所帮助,问候
【讨论】:
谢谢你只是在一个问题上发现了这个结论,所以下次我可以自己做。再次感谢兄弟。 我看了一下QGraphicsProxyWidgetPrivate::sendWidgetMouseEvent源代码,看看图形场景小部件是如何处理鼠标事件的以上是关于关于QT重载鼠标事件的一些问题的主要内容,如果未能解决你的问题,请参考以下文章