Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QMainWindow未使用setMouseTracking()跟踪鼠标_C++_Qt - Fatal编程技术网

C++ QMainWindow未使用setMouseTracking()跟踪鼠标

C++ QMainWindow未使用setMouseTracking()跟踪鼠标,c++,qt,C++,Qt,我在QMainWindow中跟踪鼠标移动时遇到问题。我有一个切换按钮按钮generate。以下是main窗口的代码 class MainWindow : public QMainWindow, private Ui::MainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); protected: void mouseMoveEvent(QMouseEvent *); private

我在
QMainWindow
中跟踪鼠标移动时遇到问题。我有一个切换按钮
按钮generate
。以下是
main窗口的代码

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
中。关闭按钮时,应关闭鼠标跟踪,且标签_5未更新。事实并非如此

无论是否按下按钮,都不会跟踪鼠标。只有当我按下鼠标按钮时,
label_5
才会更新,这与
setMouseTracking(bool)
是否处于活动状态无关


任何洞察都将不胜感激。

这是因为Qt designer在
QMainWindow
中创建了一个“隐藏”小部件,如生成的
ui\u MainWindow.h所示:

[...]
centralWidget = new QWidget(MainWindow);
[...]
MainWindow->setCentralWidget(centralWidget);
因此,正是这个小部件接收鼠标事件并放置子小部件,而不是QMainWindow

如果您放置:

centralWidget()->setAttribute(Qt::WA_TransparentForMouseEvents);
setMouseTracking(true);
在主窗口的构造器中,您将看到鼠标事件,但无法按下按钮,因为此中心小部件根本不接收任何鼠标事件

解决方案:


在Designer中设计一个小部件(带有按钮和标签),覆盖其
mouseMoveEvent
,并使用它执行
QMainWindow::setCentralWidget

这是一个非常古老的主题,很抱歉,我刚刚找到了另一个解决方案。
当您想要捕获所有主窗口上的事件时,可以使用
QApplication::notify(QObject*obj,QEvent*ev)
只要检查obj是否是您的窗口和所需的事件,就会为每个小部件上的每个事件调用它。您只需要从QApplication继承并将您的工作放在overrode notify方法中。我认为它对任何有相同问题的人都有用。

您是否验证了在
on\u buttonGenerate\u toggled
中选中的
是否为
true
是您预期的?是,切换时,
%3
参数为1。但您只会在按下鼠标按钮时看到这一点——我觉得鼠标按下可能会暂时将
hasMouseTracking
设置为1。因此,我会在_buttonGenerate_toggled
上的
中验证它。但是文档说应该传播鼠标移动事件?它会一直传播到被接受为止,这是小部件的情况,除非您将其设置为“事件透明”。为了能够跟踪QMainWindow中的子小部件顶部,您需要调用
setMouseTracking(正确)
对于每个小部件!