从 CALLBACK 访问 QT GUI

Posted

技术标签:

【中文标题】从 CALLBACK 访问 QT GUI【英文标题】:Accessing QT GUI from CALLBACK 【发布时间】:2013-12-06 13:09:15 【问题描述】:

我正在使用 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】:

首先,我将向您的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");

【讨论】:

太棒了!非常感谢!

以上是关于从 CALLBACK 访问 QT GUI的主要内容,如果未能解决你的问题,请参考以下文章

从 Qt creator 访问 Modern OpenGL 函数

Qt 从 QOpenGLWidget 访问 MainWindow

如何从另一个 QT 应用程序访问 Qt UI 的 QObject?

从网络访问管理器获取的 QT 显示图像

Qt:从代码中的任何位置访问当前设置文件

我可以从 Qt 应用程序访问哪种类型的 WinRT API?