我的Qt应用程序是从外部设备读取数据,对其进行分析,然后在屏幕上显示结果。由于需要使用GUI,因此选择了Qt而不是Winforms。我不知道该设备仅适用于Windows消息。该设备带有静态库和预定义功能。我可以从我的应用程序访问设备(并获取status参数)。问题来自于Windows消息。我需要从设备读取缓冲区,并且该设备发送BUFFER_FULL消息。我已经使用了QWidget :: winevent函数。我的实现如下所示。

在mainWindow.h中

virtual bool winEvent(MSG *message, long *result);


在mainWindow.cpp中

bool MainWindow::winEvent(MSG *message, long *result)
{
switch(message->message)
{
case BUFFER_DONE:
    qDebug()<<"***---BUFFER_DONE---***";
    return 0;

case WM_PAINT:
    // TODO: set error
    qDebug()<<"***---WM_PAINT---***";
    return 1;

default:
    break;
}
}


在调试应用程序时,它会不断获取WM_PAINT消息。我尚未实现WM_PAINT消息。该应用程序无任何显示,此时几乎“暂停”。如果没有这种winevent实施,它将显示清晰的小部件。我认为绘画小部件将由Qt处理。我的理解正确吗,还是我需要自己实现WM_PAINT?

最佳答案

WM_PAINT的默认处理会很好。它什么也不会做,这就是您想要的。但是,您实际上并不需要视觉控件。我怀疑您想要的是仅消息窗口。这是通过将HWND_MESSAGE传递到hWndParentCreateWindowEx来创建的。我不确定Qt是否提供这种功能,很可能不会。

您可以继续使用QWidget,但对我来说似乎有点过头了。如果确实要继续使用QWidget,则至少应hide

请注意,我假设您的winEvent实现是正确的。您还没有全部展示。特别是,您没有显示要为默认处理返回的消息返回false的代码。

看来我的假设是错误的。您没有从winEvent返回值。如果您启用警告,则编译器将对此发出警告。您必须执行此操作,然后注意警告。您的winEvent应该是:

bool MainWindow::winEvent(MSG *message, long *result)
{
    switch(message->message)
    {
    case BUFFER_DONE:
        qDebug()<<"***---BUFFER_DONE---***";
        return false;
    }
    return false;
}

10-02 02:57