关于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需要转换追问

不好意思啊没怎么看懂  我直接说我要做的是什么吧

参考技术B 直接写鼠标钩子函数,在点击是把光标锁定到当前窗口,然后拖动就行了本回答被提问者采纳

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重载鼠标事件的一些问题的主要内容,如果未能解决你的问题,请参考以下文章

qt鼠标悬停在按钮变大

qt linux窗口大小变化后刷新鼠标事件

Qt:添加点击事件的Label并显示图片

QT中QTableWidget鼠标事件

如何在 Qt 中模拟适用于 Linux 和 Windows 的所有鼠标和键盘事件?

qt中当鼠标移到按钮上如何改变颜色