0

マウスフックを使用してマウスの座標を取得していますが、それをラベルに表示しようとしていますが、コードが機能しません。

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

1 に答える 1

0

コードがコンパイルされたとしても、エラーに関する情報を提供しませんでした。したがって、以下はあくまでも仮定です。次の質問でより良い説明を提供してください。

あなたは2つの間違いを犯しました。まず、メソッドが呼び出されるたびに新しいメイン ウィンドウを作成します。これはあなたが望むものではないと思いますが、呼び出しごとに更新される単一のメイン ウィンドウ インスタンスです。そのため、既存のメイン ウィンドウ インスタンスへのグローバルにアクセス可能なポインターが必要です。

2 つ目は、ファイル (QtDesigner)uiを使用して設計されたウィジェットのメンバーが次のとおりであるため、コードがコンパイルされないことです。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));
}
于 2012-10-08T18:50:29.743 に答える