从CALLBACK访问QT GUI

时间:2013-12-06 13:09:15

标签: qt user-interface callback qtgui

我正在用Windows钩子捕捉我程序中发生的所有鼠标事件:

#include <Windows.h>
#pragma comment(lib, "user32.lib")
HHOOK hHook = NULL;
using namespace std;

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) {   
    switch( wParam )
    {
      case 0x201:  qDebug() << "Left click"; // Left click
    }
    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
hHook = SetWindowsHookEx(WH_MOUSE_LL, MouseProc, NULL, 0);
if (hHook == NULL) {
    qDebug() << "Hook failed";
}
ui->setupUi(this);
}

我想将MouseProc()内收到的数据放入我的QT GUI上的标签中。我怎么从那里访问它?例如,这不起作用:

ui->label1->setText("Left click");

1 个答案:

答案 0 :(得分:1)

首先,我会向你的MainWindow类添加新函数,它将返回指向你想要更新的标签的指针:

QLabel *MainWindow::label() const
{
    return ui->label1;
}

并且我会以下列方式重写回调函数:

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) {   
    switch( wParam )
    {
        case 0x201:
            qDebug() << "Left click"; // Left click
            QWidgetList wl = QApplication::topLevelWidgets ();
            foreach (QWidget *widget, wl) {
                if (MainWindow *mw = qobject_cast<MainWindow *>(widget)) {
                    mw->label()->setText("Left click");
                    break;
                }
            }
    }
    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

或者,当然,您可以使用全局变量等,但我发现这个解决方案更加优雅。

<强>更新

对我来说看起来更好的另一项改进就是隐藏标签信息并使用以下功能更新鼠标点击状态:

void MainWindow::setMouseStatus(const QString &text)
{
    ui->label1->setText(text);
}

现在你可以从回调中调用它:

[..]
mw->setMouseStatus("Left click");
相关问题