【问题标题】:Qt5: drawing on X11 root screen (and changing the WId of an existing QWidgetQt5:在 X11 根屏幕上绘图(并更改现有 QWidget 的 WId
【发布时间】:2017-03-08 09:48:03
【问题描述】:

在 Qt5 中是否仍然可以在 X11 根窗口上绘制,如果可以,如何?据我了解,这通过更改现有(刚刚创建的)QWidget 的 WId 在 Qt4 中起作用:

class Foo : public QWidget;

Foo:Foo(WId id)
        : QWidget()
{
    if (id) {
        create( id, false, true );
    }
}

尽管看起来只是对底层代码进行了微小的更改,但这显然不再可能。

使用的认可替换方法

QWidget::fromWindowContainer(QWindow::fromWinId(QX11Info::appScreen()))

对我不起作用:我收到或多或少 2 个标准窗口以及错误消息:

QXcbConnection: XCB error: 8 (BadMatch), sequence: 850, resource id: 37748756, major code: 7 (ReparentWindow), minor code: 0
QXcbConnection: XCB error: 8 (BadMatch), sequence: 962, resource id: 37748760, major code: 7 (ReparentWindow), minor code: 0
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1

我自己没有调用paintEngine,也没有在我的QWidget::paintEvent()覆盖之外进行任何绘画。

我看到有人问过类似的问题,但仍未得到解答,我希望这个问题更成功。

【问题讨论】:

    标签: qt5 x11 desktop


    【解决方案1】:

    appScreen 返回屏幕编号,而不是窗口 ID。它为第一个屏幕/监视器返回 0,这恰好是默认告诉 QWidget() 创建一个新窗口。您需要 QX11Info::appRootWindow() 函数。

    【讨论】:

    • 哦,是的。我需要检查我是否确实直接使用了 appScreen() (这不仅仅是在问我的问题时的疏忽),或者我是否将它输入到一个函数中以获取相应的根窗口 ID。编辑:不过,我确实尝试使用 QDesktopSomething 类函数,该函数应该返回对应于根窗口的 QWidget,这给了我或多或少相同的结果)。
    猜你喜欢
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 2012-12-12
    • 1970-01-01
    相关资源
    最近更新 更多