2011-08-04 102 views
1

我一直在努力尋找一種方法來創建一個帶有不透明文本的透明Qtextedit。由於術語「透明度」通常是不明確的,因此我將Qtextedit「透明度」定義爲能夠看到Qtextedit中的文本與主窗口背後的任何內容(例如桌面背景,Windows媒體播放器等)重疊。如果可能的話我希望能夠在各個級別設置透明度並跨系統兼容,但這不是必需的。如何在QTextEdit中創建完全透明度

我是一個極端的初學者,因爲我只用了pyqt4三個星期,python 3.x幾個月,這是我在我的存在中獲得的所有編程經驗。我一直試圖破譯關於這個問題的Pyqt文檔,但是它的編寫方式似乎認爲數十年來一直是一個gui programer,更不用說知道C++了。此外,當在線詢問這個問題時,它似乎從未如此解決:a)記錄良好或b)可普遍化

這是非常令人驚訝的,因爲它似乎是人們想要做的基本操作

此解決方案的工作原理似乎並不直接對除顯示透明圖像之外的任何東西有用。我也真的不明白這一切是很好,簡單地從QWidget中改變基類的QMainWindow使得整個事情失敗

http://www.loopbacking.info/blog/2008/07/11/transparent-windows-howto/

以下鏈接體現了常見的方式人建議來解決類似的問題這是他們的陷阱,爲什麼他們不工作,但不幸的是他們使用Qt的C++版本,並且在這一點上我的技能也有所提高。

http://www.qtcentre.org/threads/18072-How-to-set-Qt-window-transparent

我的系統是視窗7上用的Quadro NVS 140其驅動程序的版本是因爲這後的電流(Verde的275.33)我的PyQt的版本的Dell Latitude D830最終32位是4.8(PyQt的-PY3 .2-x86-gpl-4.8.5-1.exe Windows 32位安裝程序)我也在使用Python 3.2.1(開源版本)

我的代碼的一個基本示例位於相關的)行註釋掉:

當我嘗試註釋掉的代碼時,顏色我通常只看到黑色。此外,當我調整窗口大小時,黑暗度會隨機改變強度,主窗口的顯示在最大化時似乎會損壞。

我將不勝感激任何關於此事的幫助!

import sys 
import PyQt4 
from PyQt4 import QtGui, QtCore 

class Transparent(QtGui.QMainWindow): 
    def __init__(self,parent = None): 
     QtGui.QMainWindow.__init__(self,parent) 
     self.initialize() 

    def initialize(self): 
     #self.colorset(self,'Window',200,255,100,20) 
     #self.colorset(self,'Base',200,255,100,20) 
     #self.setBackgroundRole(QtGui.QPalette.Base) 
     #self.setAttribute(QtCore.Qt.WA_NoSystemBackground) 
     #self.setAutoFillBackground(True) 
     #self.mask() 
     self.setWindowTitle("Chernobyl-like Failure") 

     self.answerlabel = QtGui.QLabel('Text Response Display') 
     self.answerlabel.setFrameStyle(QtGui.QFrame.Panel | QtGui.QFrame.Raised) 
     self.answerlabel.setMinimumHeight(25) 
     self.questionlabel = QtGui.QLabel("Question:") 
     self.questionlabel.setFrameStyle(QtGui.QFrame.Panel | QtGui.QFrame.Raised) 

     self.questionbox = QtGui.QLineEdit() 
     self.questionbox.setMinimumWidth(500) 

     self.askbutton = QtGui.QPushButton("Ask it!") 

     self.historybox = QtGui.QTextEdit('Question & Answer history will be displayed here') 
     self.historybox.setReadOnly(True) 
     #self.colorset(self.historybox,'Base',200,255,100,127) 
     self.grid = QtGui.QGridLayout() 
     widgetlist = [['answerlabel',0,0,1,3],['questionlabel',1,0,1,1], 
         ['questionbox',1,1,1,1],['askbutton',1,2,1,1],['historybox',2,0,1,3]] 
     for widget in widgetlist: 
      self.grid.addWidget(eval("self.{0}".format(widget[0])),*widget[1:]) 

     self.centralwidget = QtGui.QFrame() 
     self.centralwidget.setFrameStyle(QtGui.QFrame.Box|QtGui.QFrame.Raised) 
     self.centralwidget.setLineWidth(5) 
     self.centralwidget.setLayout(self.grid) 
     #self.colorset(self.centralwidget,'Base',200,255,100,127) 
     self.setCentralWidget(self.centralwidget) 

    def colorset(self,widget,part,h,s,l,a): 
     pal = widget.palette() 
     color = QtGui.QColor() 
     color.setHsl(h,s,l,a) 
     pal.setColor(eval('QtGui.QPalette.{0}'.format(part)),color) 
     widget.setPalette(pal) 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    main_window = Transparent() 
    main_window.show() 
    sys.exit(app.exec_()) 

回答

0

爲了讓你的主窗口透明,您必須設置Qt.WA_TranslucentBackground屬性(使用setAttribute(Qt.WA_TranslucentBackground))。在Windows下,您還必須在主窗口上設置Qt.FramelessWindowHint屬性。但是,根據docs,「用戶無法通過窗口系統移動或調整無邊框窗口的大小。」所以,如果你想要這個功能,你必須手動實現它。這是一個thread,給出了一個在C++中的例子。

一旦你有了一個透明的MainWindow,你可以通過設置背景顏色爲RGBA值來控制它的透明度和任何子窗口小部件。這裏是一個愚蠢的例子,

from PyQt4 import QtGui, QtCore 
import sys 

class Main(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(Main, self).__init__(parent) 

     self.setWindowFlags(QtCore.Qt.FramelessWindowHint) 
     self.setAttribute(QtCore.Qt.WA_TranslucentBackground) 

     frame = QtGui.QFrame(parent=self) 
     frame.setStyleSheet("QFrame {background: rgba(0,255,0,20%)}") 
     box=QtGui.QHBoxLayout() 

     edit = QtGui.QTextEdit() 
     edit.setStyleSheet("background: rgba(0,0,255,20%)") 
     box.addWidget(edit) 

     edit2=QtGui.QTextEdit() 
     edit2.setStyleSheet("background: rgb(255,0,0)") 
     box.addWidget(edit2) 
     frame.setLayout(box) 

     pushbutton = QtGui.QPushButton('Quit') 
     pushbutton.clicked.connect(self.close) 
     box.addWidget(pushbutton) 

     self.setCentralWidget(frame)   

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    main = Main() 
    main.show() 

    app.exec_() 
+0

謝謝你的工作完美!如何刪除textedit後面的QFrame和QWindow部分,以便QFrame和QWindow的顏色/不透明度不影響文本編輯的背景?在你的例子我試圖self.setMask(QtGui.QRegion(edit.rect()))和 self.setMask(QtGui.QRegion(self.edit.rect()))在一起,但他們什麼都沒做 – THX1138

+0

這是一個很好的問題。我不知道是否只能在TextEdit後面更改窗口透明度。 –