2011-08-04 49 views
1

不透明なテキストを含む透明なQtexteditを作成する方法を理解するために何度も努力してきました。 Qtexteditの「透過性」は、Qtexteditのテキストをメインウィンドウの直ぐ後ろに重ねて表示することができると定義しています(デスクトップの背景、Windowsのメディアプレーヤーなど)。可能であればさまざまなレベルで透明性を設定し、システムとの互換性を確保したいと考えていますが、これは必須ではありません。QTextEditで完全な透明度を作成する方法

私はpyqt4を3週間、python 3.xを数ヶ月使用していたので、私は極端な初心者です。これは私の存在で得たプログラミングの経験です。私はこの問題に関してPyqtのドキュメントを解読しようとしていますが、C++の知識を持つことは言うまでもなく、何十年もGUIプログラマーであったと思われるように書かれています。さらに、この質問がオンラインで尋ねられると、次のいずれかの方法で決して解決されないように見える場合があります:a)十分に文書化されているかb)一般化可能

これは人々がやりたい基本的な操作のように思われるので、非常に驚​​きです。

このソリューションは機能しますが、透明な画像を表示する以外には直接役に立ちません。作るだけでQMainWindowにQWidgetから基本クラスを変更するように私も本当に全部が

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

私のシステムは、PyQtは私のバージョンのドライババージョンこのポスト現在のもので(ベルデ275.33)のQuadro NVS 140とDellの緯度D830のWindows 7の究極の32ビットは4.8(PyQtは、PY3あります.2-x86-gpl-4.8.5-1.exe Windows 32 bitインストーラー)私はまた、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

あなたのメインウィンドウを透明にするには、(setAttribute(Qt.WA_TranslucentBackground)を使用して)Qt.WA_TranslucentBackground属性を設定する必要があります。 Windowsでは、メインウィンドウにQt.FramelessWindowHint属性も設定する必要があります。しかしながら、docsによれば、「ユーザはウィンドウシステムを介してボーダレスウィンドウを移動またはサイズ変更することができない」。したがって、その機能が必要な場合は、手動で実装する必要があります。ここにはthreadがあり、C++の例です。

透明なメインウィンドウを作成したら、背景色を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

ありがとうございました。QFrameとQWindowの色/不透明度がテキスト編集の背景に影響しないように、テキスト編集の背後にあるQFrameとQWindowの部分をどうやって削除しますか?あなたの例では、私はself.setMask(QtGui.QRegion(edit.rect()))と self.setMask(QtGui.QRegion(self.edit.rect()))を一緒に試みましたが、何もしませんでした – THX1138

+0

それは良い質問です。私はあなたがTextEditの背後でのみウィンドウ透明度を変更できるかどうかはわかりません。 –

関連する問題