C++ 在Qt中实现winevent时是否需要WM_油漆

C++ 在Qt中实现winevent时是否需要WM_油漆,c++,windows,qt,message-queue,C++,Windows,Qt,Message Queue,我的Qt应用程序是从外部设备读取数据,分析数据,然后在屏幕上显示结果。由于需要使用GUI,我选择了Qt而不是Winforms。我不知道那个设备只处理windows消息。该设备带有静态库和预定义函数。我可以从应用程序访问设备(并获取状态参数)。问题来自windows消息。我需要从设备读取缓冲区,并为该设备发送缓冲区满消息。我已经为此使用了QWidget::winevent函数。我的实现如下所示 在主窗口中 virtual bool winEvent(MSG *message, long *resu

我的Qt应用程序是从外部设备读取数据,分析数据,然后在屏幕上显示结果。由于需要使用GUI,我选择了Qt而不是Winforms。我不知道那个设备只处理windows消息。该设备带有静态库和预定义函数。我可以从应用程序访问设备(并获取状态参数)。问题来自windows消息。我需要从设备读取缓冲区,并为该设备发送缓冲区满消息。我已经为此使用了QWidget::winevent函数。我的实现如下所示

在主窗口中

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;
}
}
bool主窗口::winEvent(消息*消息,长*结果)
{
开关(消息->消息)
{
案例缓冲区已完成:

qDebug()
WM_PAINT
的默认处理将很好。它不会做任何事情,这正是您想要的。但是,您并不真正想要这里的视觉控件。我怀疑,您想要的是一个只显示消息的窗口。它是通过将
HWND_消息
传递到
CreateWindowEx
hwndprent
来创建的。我不确定Qt是否提供这样的功能,很可能不是

你可以继续使用
QWidget
,但对我来说这似乎有点过头了。如果你继续使用
QWidget
,那么你至少应该这样做

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

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

bool MainWindow::winEvent(MSG *message, long *result)
{
    switch(message->message)
    {
    case BUFFER_DONE:
        qDebug()<<"***---BUFFER_DONE---***";
        return false;
    }
    return false;
}
bool主窗口::winEvent(消息*消息,长*结果)
{
开关(消息->消息)
{
案例缓冲区已完成:

qDebug()您绘制的内容将出现在哪里?我自己不绘制任何内容。我使用QWidget只是为了使用winevent。最终我将读取缓冲区并在另一个线程中处理它。QWidget具有默认绘制机制。我只想使用它。此外,我想我将使用QWidget::paintEvent().WM_PAINT是特定于窗口的消息。对吗?你需要一个小部件吗?你不想要一个只包含消息的窗口吗?很抱歉我不知道你在说什么。在Qt中唯一可以接受消息的是QWidget,对吗?你的设备库是只通过windows消息传递数据,还是它也需要一个窗口句柄来处理数据nt打开?如果打开,则必须有一个接口函数接受您创建的窗口的HWND。如果未打开,则接口消息是否都是自定义消息(即WM_用户+…)或者您是否也会收到系统消息,如WM_CREATE、WM_PAINT、WM_CLOSE等?请注意,如果您的小部件在windows下可见,但不一定来自您的设备,则它将接收WM_PAINT。设备文档中说了什么?请查看编辑。我希望我自己已经清除得更好。您为什么要使小部件可见?我不是。那是什么是qt的默认行为。我必须告诉你,我不是一个经验丰富的程序员。这是我使用qt的第一个项目。因此,我可能错了,这就是为什么我在这里寻求帮助。在小部件上调用
hide()
,隐藏它。我能提供的最好建议是启用警告并听取它们。编译器会立即发现这一点。