Qt5:在X11根屏幕上绘图(并更改现有QWidget

时间:2017-03-07 10:32:15

标签: qt5 x11 desktop

在Qt5中是否仍然可以在X11根窗口上绘图,如果是这样,怎么样?据我所知,这在Qt4中通过改变现有(刚刚创建的)QWidget的WId来起作用:

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()覆盖之外做任何绘画。

我看到类似的问题已经被问到但仍然没有答案,我希望这个问题取得更大的成功。

1 个答案:

答案 0 :(得分:1)

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