如何从鼠标钩子程序访问MainWindow标签?

时间:2012-10-08 17:34:52

标签: c++ qt

我正在使用鼠标钩来获取鼠标坐标,但我试图在我的标签上显示它并且代码不起作用。

LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(nCode==HC_ACTION)
    {
    POINT p;
    GetCursorPos(&p);
    MainWindow* mw = new MainWindow();
    mw->ui->label->setText(QString::number(p.x)+"|"+QString::number(p.y));//this code don't work!
    }
    return CallNextHookEx(NULL,nCode,wParam,lParam);
 }

1 个答案:

答案 0 :(得分:0)

您没有提供有关错误的任何信息,即使您的代码编译也没有。所以以下只是假设。请在下一个问题中提供更好的说明。

你犯了两个错误。首先,每次调用方法时,创建一个新的主窗口。我不认为这是你想要的,而是一个主要窗口实例,它在每次调用时都会更新。因此,您需要一个指向现有主窗口实例的全局可访问指针。

第二件事是您的代码无法编译,因为使用ui文件(QtDesigner)设计的任何窗口小部件的成员uiprivate

class MainWindow : public QMainWindow
{
   ...
private:
   Ui::MainWindow *ui;
};

所以你可能无法从这门课外访问它。这有一个很好的理由:小部件(主窗口)的设计方式不应该打扰这个类之外的代码(信息/实现隐藏原则)。

您应该提供一个公共方法来设置数据:

class MainWindow : public QMainWindow
{
public:
    void updateCursorPos(int x, int y);
};

实现可能如下所示:

MainWindow::updateCursorPos(int x, int y)
{
    ui->label->setText(QString::number(x) + "|" + QString::number(y));
}

然后你应该这样称呼它:

POINT p;
GetCursorPos(&p);
mw->updateCursorPos(p.x, p.y);

最后,我看不出为什么必须使用本机代码来获取光标坐标的原因,因为Qt有一个非常简单的方法:QPoint QCursor::pos()

例如,您可以使用计时器定期查询光标位置。为此,添加一个带有以下签名的插槽(您不再需要上面的方法):

class MainWindow : public QMainWindow
{
public slots:
    void updateCursorPos();
};

并将其纳入您的实施:

// constructor
MainWindow::MainWindow(...) : ...
{
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(updateCursorPos()));
    timer->setInterval(50);
    timer->start();
}

void MainWindow::updateCursorPos()
{
    QPoint p = QCursor::pos();
    ui->label->setText(QString::number(p.x) + "|" + QString::number(p.y));
}