我在跟踪QMainWindow
中的鼠标移动时遇到问题。我有一个切换按钮buttonGenerate
。以下是MainWindow
class MainWindow : public QMainWindow, private Ui::MainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
protected:
void mouseMoveEvent(QMouseEvent *);
private slots:
void on_buttonGenerate_toggled(bool checked);
};
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
label_5->setText(tr("%1 %2 %3")
.arg(event->x())
.arg(event->y())
.arg(hasMouseTracking()));
event->ignore();
}
void MainWindow::on_buttonGenerate_toggled(bool checked)
{
buttonGenerate->setText(checked
? tr("Stop")
: tr("Start"));
setMouseTracking(checked);
}
当按钮打开时,应跟踪鼠标及其X& Y坐标以及是否启用跟踪应显示在label_5
中。当关闭按钮时,应关闭鼠标跟踪并且不更新label_5。事实并非如此。
无论是否按下按钮,都不会跟踪鼠标。只有当我按住鼠标按钮时才会更新label_5
,这与setMouseTracking(bool)
是否处于活动状态无关。
非常感谢任何见解。
答案 0 :(得分:14)
这是因为Qt设计师在QMainWindow
中创建了一个“隐藏”小部件,如生成的ui_MainWindow.h
中所示:
[...]
centralWidget = new QWidget(MainWindow);
[...]
MainWindow->setCentralWidget(centralWidget);
因此,这个小部件接收鼠标事件并放置子窗口小部件,而不是QMainWindow。
如果你放置:
centralWidget()->setAttribute(Qt::WA_TransparentForMouseEvents);
setMouseTracking(true);
在主窗口的构造函数中,您将看到鼠标事件,但您无法按下按钮,因为此中央窗口小部件根本不会收到任何鼠标事件。
解决方案:
在Designer中设计一个小部件(带有按钮和标签),覆盖其mouseMoveEvent
并使用它QMainWindow::setCentralWidget
。
答案 1 :(得分:1)
这是一个非常古老的话题,对不起,我刚刚找到了另一个解决方案。
当您想要捕获所有MainWindow上的事件时,只需检查obj是否是您的窗口和所需事件,就可以使用QApplication::notify(QObject* obj, QEvent* ev)
,每个窗口小部件上的每个事件都会调用它。您只需要从QApplication继承并将您的工作放在overrode notify方法中。我认为这对任何有同样问题的人都有用。