【发布时间】:2016-03-25 09:54:18
【问题描述】:
我有一个QGridLayout,其中每个单元格都包含我的自定义小部件QFrameExtended,定义如下:
在.h中:
#ifndef QFRAMEEXTENDED_H
#define QFRAMEEXTENDED_H
#include <QObject>
#include <QFrame>
class QFrameExtended : public QFrame
{
Q_OBJECT
private:
public:
int id;
explicit QFrameExtended(QWidget *parent = 0);
signals:
void mousePressEvent(QMouseEvent *);
void mouseReleaseEvent(QMouseEvent *);
void pressed(QFrameExtended *);
void released(QFrameExtended *);
public slots:
void on_mouse_press();
void on_mouse_release();
};
#endif // QFRAMEEXTENDED_H
在 .cpp 中:
#include "qframe_extended.h"
QFrameExtended::QFrameExtended(QWidget *parent) : QFrame(parent)
{
this->id = /* Imagine here there is a function to generate an id */ ;
connect( this, SIGNAL( mousePressEvent(QMouseEvent*) ), this, SLOT( on_mouse_press() ) );
connect( this, SIGNAL( mouseReleaseEvent(QMouseEvent*) ), this, SLOT( on_mouse_release() ) );
}
void QFrameExtended::on_mouse_press() {
emit pressed(this);
}
void QFrameExtended::on_mouse_release() {
emit released(this);
}
我的表单使用QFrameExtended 小部件创建QGridLayout,并为每个小部件定义一个事件处理程序:
/* ... */
/* This snippet of code is inside a loop that is creating frame objects */
connect(frame, &QFrameExtended::pressed, this, &MyForm::on_mouse_press);
connect(frame, &QFrameExtended::released, this, &MyForm::on_mouse_release);
/* ... */
最后是事件处理程序:
void MyForm::on_mouse_press(QFrameExtended *frame) {
qDebug() << "Pressed here: " << frame->id << endl;
}
void MyForm::on_mouse_release(QFrameExtended *frame) {
qDebug() << "Released here: " << frame->id << endl;
}
当我点击一个单元格(即 QFrameExtended 小部件)而不释放按钮时,我会看到控制台上打印了单元格的 id。在我将鼠标移到另一个单元格上后,当我释放按钮时,我会看到打印了第二个 id。
一个例子是这样的输出:
在这里按下:1
在这里发布:3
但实际情况是,当我在 QFrameExtended 上按下鼠标按钮时,他开始抓取所有鼠标事件,直到我释放按钮。这是预期的行为:
当在窗口小部件内按下鼠标按钮时,Qt 会自动抓取鼠标;小部件将继续接收鼠标事件,直到最后一个鼠标按钮被释放。
发件人:http://doc.qt.io/qt-4.8/qmouseevent.html
如何改变这种行为?如果你也能给我一个例子,我将不胜感激
【问题讨论】:
-
反转逻辑:不接受子小部件中的鼠标事件,让它传播到这些小部件的容器,并在那里找出鼠标光标在哪个子小部件上(
childAt)。
标签: c++ qt mouseevent