2017-08-27 136 views
0

我試圖將子窗口小部件添加到Qt5中的窗口小部件。 問題是,父窗口小部件呈現的內容不爲Qt所知,因此透明度無法正常工作。使用自定義QPainter呈現QWidget

要解決這個問題,我需要使用自定義QPainter來呈現小部件。
在Qt4中,我可以通過使用屬性WA_PaintOutsidePaintEvent並以另一種方法呈現小部件來實現。
但是,在Qt5中,這個屬性消失了。

我已經試過什麼:

  • 創建一個QWidget並重寫的paintEvent方法。
    • 沒有真正的工作(沒有畫任何東西),但也許這只是一個小小的錯誤。據我瞭解,這個事件也不會讓小部件自己做渲染,這是我想要阻止的。
  • 創建的QGraphicsView和QGraphicsScene和小工具加入到QGraphicsScene
    • 繪製控件和透明度的工作。事件(鼠標&鍵盤),但是,不起作用。
+0

請顯示您的代碼 – eyllanesc

+0

我真的不知道這是怎麼用的。我的代碼目前只是很多實驗。 如果有幫助,我可以用更多的代碼充實這些例子,但考慮到我目前不知道自己在做什麼,我懷疑這會有所幫助。 它歸結爲我需要能夠以某種方式將子窗口小部件繪製到QImage中,並且他們仍然需要能夠獲取鼠標和鍵盤事件。 –

+0

然後我試着先學習和理解基礎知識,然後用我剛剛經歷的知識。我不太瞭解你的問題,例如,這意味着「問題在於父部件渲染的內容不爲Qt所知」。它顯示了你想要理解你的圖像,如果你打算把這個小部件放在另一個小部件使用的佈局中,改變如果你想改變顏色,小部件的形式,你必須重寫方法paintEvent 。 – eyllanesc

回答

0

我最終什麼事做和工作正常:

我使用的是定製的頂級窗口部件,沒有額外的功能,使鼠標和鍵盤操作更輕鬆。
此小部件沒有父項,並且使用QImage將其與子項呈現在內存中併疊加爲圖像。這樣透明效果。這裏重要的是WA_NoSystemBackground屬性。
爲了使事件起作用,我在應用程序上安裝了一個事件過濾器,並將事件傳遞給我的自定義小部件中的小部件。 我會告訴你細節,我計劃在今年晚些時候將代碼公開,我會在完成後添加一個鏈接。

然而,經過這些事件時,兩個重要的注意事項:
一是防止無限遞歸循環,因爲您的過濾器也將趕上你發送的事件,我已經檢查了接收對象是否是一個小部件,如果是這樣,我只是檢查這個小部件的topLevelWidget是否是我的自定義小部件類的實例,如果是,則忽略該事件。其次,簡單地傳遞鼠標事件並不會使鼠標過度工作。有獨立的懸停事件,你必須照顧自己。