关闭小部件时出现嵌入式 Qt GUI 工件

Posted

技术标签:

【中文标题】关闭小部件时出现嵌入式 Qt GUI 工件【英文标题】:Embedded Qt GUI Artifacts Appear when Dismissing Widgets 【发布时间】:2012-09-07 15:43:31 【问题描述】:

我正在为嵌入式 Linux 设备开发一个触摸屏 GUI,该设备将位于视频源上。因此,我需要我的 GUI 透明并在超时后消失,以便用户可以查看视频源。我的 GUI 的 main.cpp 使用以下代码确保使用 -qws 选项运行的整个应用程序的背景是透明的:

QApplication a(argc, argv, QApplication::GuiServer);
QWSServer::instance()->setBackground(QBrush(Qt::NoBrush));
QWSServer::setCursorVisible (false);

我有一个主要的底层小部件,它拥有 GUI 中的所有其他小部件。我使用以下调色板相关代码将背景设置为透明。

QPalette transparentPallete;
transparentPallete.setColor(QPalette::Window, Qt::transparent);
setAutoFillBackground(true);
setPalette(transparentPallete);

我还重写了 paintEvent 方法以尝试确保背景始终处于干净透明的状态:

void MainWidget::paintEvent(QPaintEvent *event)

    QPainter p(this);

    // Fill background
    p.setPen(Qt::NoPen); // no outlines
    p.fillRect(0,0,width(),height(),QColor(255, 255, 255, 0)); // Fill rectangle with color


现在我可以启动我的应用程序并通过原始视频源查看我的 GUI,我可以通过触摸进行交互以在 GUI 中显示不同的窗口并让它们消失。

当我点击“取消”或命令 GUI 的某些部分消失时,我无法完成删除留下的工件。这些工件看起来非常难看(多条垂直线/错误的颜色),并且只有在调用 GUI 的另一部分来替换屏幕上的该位置时才会消失。无论我是否启用了视频源(无论如何它都存在于由处理器 dss 控制的不同叠加层上),它们都在那里。

我怎样才能摆脱这些在关闭一些小部件后留下的工件?

注意:这肯定与以下行相关:

QWSServer::instance()->setBackground(QBrush(Qt::NoBrush)); // Allows transparent pixels to be written to frame buffer

如果我关闭这条线,我看不到底层的覆盖,但我也没有得到任何奇怪的行为,我的表现变得更好。我怎样才能实现透明但又丢失了奇怪的工件?

【问题讨论】:

【参考方案1】:

以下显然有问题:

QWSServer::instance()->setBackground(QBrush(Qt::NoBrush));

但这解决了问题,我看到 0 个工件:

QWSServer::setBackground(QBrush(QColor(0, 0, 0, 0)));

【讨论】:

以上是关于关闭小部件时出现嵌入式 Qt GUI 工件的主要内容,如果未能解决你的问题,请参考以下文章

在 QT 中实现具有多个小部件的视图的最佳方法是啥?

将 PySide/PyQt 小部件嵌入到 Qt/C++ 应用程序中

在 Qt 设计器中创建要提升的自定义小部件

Qt 小部件 4.7 与 5.1 [关闭]

QT - 在不阻止他的 GUI 的情况下显示小部件

Qt:访问在构造函数之外使用 GUI 小部件的类的函数