【问题标题】:is WM_PAINT necessary while implementing winevent in Qt在 Qt 中实现 winevent 时是否需要 WM_PAINT
【发布时间】: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


【解决方案1】:

WM_PAINT 的默认处理就可以了。它什么也不做,这就是你想要的。但是,您并不真正想要这里的视觉控制。我怀疑你想要的只是一个消息窗口。这是通过将HWND_MESSAGE 传递给CreateWindowExhWndParent 创建的。我不确定 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;
}

【讨论】:

  • 请查看编辑。我希望我能更好地清理自己
  • 为什么要让小部件可见?
  • 我不是。这是qt的默认行为。我必须告诉你我不是经验丰富的程序员。这是我第一个使用 qt 的项目。所以,我可能错了,这就是我在这里寻求帮助的原因。
  • 在小部件上调用hide() 将其隐藏。
  • 我能提供的最佳建议是启用警告并听取它们。编译器会立即发现。
猜你喜欢
  • 2012-01-06
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
相关资源
最近更新 更多