簡體   English   中英

如何從鼠標鈎子程序訪問MainWindow標簽?

[英]How can i access MainWindow label from mouse hook procedure?

我正在使用鼠標掛鈎來獲取鼠標坐標,但是我試圖將其顯示在標簽上,並且代碼無法正常工作。

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);
 }

您沒有提供有關該錯誤的任何信息,即使您的代碼已編譯也是如此。 因此,以下僅是假設。 請在下一個問題中提供更好的描述。

你犯了兩個錯誤。 首先,每次調用方法時都創建一個新的主窗口。 我認為這不是您想要的,而是一個主窗口實例,該實例在每次調用中都會更新。 因此,您需要一個可全局訪問的指向現有主窗口實例的指針。

第二件事是您的代碼將無法編譯,因為使用ui文件(QtDesigner)設計的任何小部件的成員ui都是private

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));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM