【发布时间】:2014-05-10 12:20:30
【问题描述】:
我的 Qt 应用程序是从外部设备读取数据,对其进行分析,然后将结果显示在屏幕上。由于我需要使用 GUI,因此我选择了 Qt 而不是 Winforms。我不知道该设备只能处理 Windows 消息。该设备带有静态库和预定义功能。我可以从我的应用程序访问设备(并获取状态参数)。问题来自 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?
【问题讨论】:
-
你画的东西会出现在哪里?
-
我自己什么都不画。我只使用 QWidget 来使用 winevent。最终我将只读取缓冲区并在另一个线程中处理它。 QWidget 具有默认的绘制机制。我只是想使用它。另外,我想我会使用 QWidget::paintEvent()。 WM_PAINT 是特定于窗口的消息。对吗?
-
你需要一个小部件吗?你不想要一个只有消息的窗口吗?
-
我很抱歉我的无知,但我不明白你在说什么。 Qt 中唯一可以接受消息的就是 QWidget,对吧?
-
您的设备库是仅通过 Windows 消息向您传递数据,还是还需要一个窗口句柄才能进行绘制?如果是,则必须有一个接口函数接受您创建的窗口的 HWND。如果不是,那么接口消息是否都是自定义消息(即 WM_USER+.....),或者您是否还收到系统消息,例如 WM_CREATE、WM_PAINT、WM_CLOSE 等?请注意,如果您的小部件可见,但不一定来自您的设备,您的小部件将在 windows 下收到 WM_PAINT。设备文档是怎么说的?
标签: c++ windows qt message-queue