コードがコンパイルされたとしても、エラーに関する情報を提供しませんでした。したがって、以下はあくまでも仮定です。次の質問でより良い説明を提供してください。
あなたは2つの間違いを犯しました。まず、メソッドが呼び出されるたびに新しいメイン ウィンドウを作成します。これはあなたが望むものではないと思いますが、呼び出しごとに更新される単一のメイン ウィンドウ インスタンスです。そのため、既存のメイン ウィンドウ インスタンスへのグローバルにアクセス可能なポインターが必要です。
2 つ目は、ファイル (QtDesigner)ui
を使用して設計されたウィジェットのメンバーが次のとおりであるため、コードがコンパイルされないことです。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));
}