即使您的代码编译,您也没有提供有关错误的任何信息。所以以下只是假设。请在下一个问题中提供更好的描述。
你犯了两个错误。首先,每次调用方法时都会创建一个新的主窗口。我认为这不是您想要的,而是一个在每次调用中都会更新的主窗口实例。因此,您需要一个指向现有主窗口实例的全局可访问指针。
第二件事是您的代码不会编译,因为ui
使用ui
文件(QtDesigner)设计的任何小部件的成员是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));
}