2017-03-07 76 views
1

在Qt5中繪製X11根窗口仍然有可能嗎?如果是這樣,如何實現?據我所知,通過更改Qt4現有的(剛創建)的QWidget的WID:Qt5:繪製X11根屏幕(並更改現有QWidget的WId

class Foo : public QWidget; 

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

顯然,這已不再可能,儘管看起來像只小的改動底層代碼

使用

QWidget::fromWindowContainer(QWindow::fromWinId(QX11Info::appScreen())) 
的認可替代方法。

不爲我工作:我得到2級或多或少標準的Windows +錯誤消息:

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

appScreen返回一個屏幕編號,而不是窗口ID。它爲第一個屏幕/監視器返回0,而這恰好是默認情況下告訴QWidget()創建一個新窗口。您需要QX11Info :: appRootWindow()函數。

+0

Doh,是的。我需要檢查是否確實直接使用appScreen()(並且這不僅僅是在詢問我的問題時忽略),還是將它提供給函數以獲取相應的根窗口ID。 編輯:我做過但QDesktopSomething類的功能,應該返回一個QWidget對應的根窗口,並給了我或多或少相同的結果)。 – RJVB