QMainWindow未使用setMouseTracking()跟踪鼠标
QMainWindow not tracking mouse with setMouseTracking()
我在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)
是否处于活动状态无关。
如有任何见解,我们将不胜感激。
这是因为Qt设计器在QMainWindow
中创建了一个"隐藏"小部件,如生成的ui_MainWindow.h
:中所示
[...]
centralWidget = new QWidget(MainWindow);
[...]
MainWindow->setCentralWidget(centralWidget);
因此,正是这个小部件接收鼠标事件并放置子小部件,而不是QMainWindow。
如果您放置:
centralWidget()->setAttribute(Qt::WA_TransparentForMouseEvents);
setMouseTracking(true);
在主窗口的构造函数中,您将看到鼠标事件,但无法按下按钮,因为这个中心小部件根本不会接收到任何鼠标事件。
解决方案:
在Designer中设计一个小部件(带有按钮和标签),覆盖它的mouseMoveEvent
并用它做一个QMainWindow::setCentralWidget
。
这是一个非常古老的话题,很抱歉,但我刚刚找到了另一个解决方案。当您想在所有MainWindow上捕捉事件时,只需检查obj是否是您的窗口和所需的事件,就可以使用QApplication::notify(QObject* obj, QEvent* ev)
,它是为每个小部件上的每个事件调用的。您只需要从QApplication继承并将您的工作放在override-notify方法中。我认为它对任何有同样问题的人都有用。
相关文章:
- WinAPI挂钩鼠标
- 光线跟踪器灯光反射错误
- 人脸跟踪arduino代码的优化
- 将鼠标悬停在问题上时与预期">"相关的代码错误
- 跟踪滚动条上的鼠标事件
- SendInput()鼠标移动计算
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 我可以在 SDL 窗口外跟踪我的鼠标 pos 吗?
- 跟踪鼠标输入事件
- 鼠标跟踪的原始输入始终返回 0 作为增量值
- 无法跟踪鼠标事件 OpenCV
- Qt mouseMoveEvent-跟踪鼠标位置
- 在Qt中跟踪鼠标坐标
- 在QMainWindow中选择性跟踪鼠标
- QMainWindow未使用setMouseTracking()跟踪鼠标
- 如何在QT中同时使用QImage和鼠标跟踪事件
- 如何在opencv中使用对象跟踪的概念移动鼠标
- 你能用SDL2跟踪多个鼠标吗?
- Qt中的鼠标跟踪
- 不能正确跟踪鼠标移动,setMouseTracking没有效果- Qt