2013-11-13 3 views
2

enter image description herePyQt: прозрачный фон QGLWidget

Я надеюсь сделать QGLWidget, который имеет прозрачный фон, как рисунке выше.
Это код cpp, и я не понимаю некоторые его части. Насколько я знаю, он использует дескриптор окна, контекст рисования и т. Д. Но я бедна C и C++. Я использовал Python и PyQt, поэтому для меня это похоже на Атлантиду. Есть ли какая-нибудь идея для QGLWidget, которая имеет прозрачный фон?

ADD

from PyQt4.QtCore import Qt 
from PyQt4.QtGui import QApplication, QColor 
from PyQt4.QtOpenGL import QGLWidget 

from OpenGL import GL 
import sys 

class TransGLWidget(QGLWidget): 
    def __init__(self, parent=None): 
     QGLWidget.__init__(self, parent) 
     self.setWindowFlags(Qt.FramelessWindowHint) 
     self.setAttribute(Qt.WA_TranslucentBackground, True) 
     self.setGeometry(200, 100, 640, 480) 

    def initializeGL(self): 
     self.qglClearColor(QColor(0, 0, 0, 0)) 

    def resizeGL(self, w, h): 
     GL.glViewport(0, 0, w, h) 
     GL.glMatrixMode(GL.GL_PROJECTION) 
     GL.glLoadIdentity() 
     x = float(w)/h 
     GL.glFrustum(-x, x, -1.0, 1.0, 1.0, 10.0) 
     GL.glMatrixMode(GL.GL_MODELVIEW) 
     GL.glLoadIdentity() 

    def paintGL(self): 
     GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT) 

     GL.glBegin(GL.GL_TRIANGLES) 
     GL.glColor3f(1.0, 0.0, 0.0) 
     GL.glVertex3f(-1.0, 1.0, -3.0) 
     GL.glColor3f(0.0, 1.0, 0.0) 
     GL.glVertex3f(1.0, 1.0, -3.0) 
     GL.glColor3f(0.0, 0.0, 1.0) 
     GL.glVertex3f(0.0, -1.0, -3.0) 
     GL.glEnd() 

app = QApplication(sys.argv) 
widget = TransGLWidget()  
widget.show() 
app.exec_() 

Стараюсь с кодом выше, но он не показывает мне ничего. (Кажется, весь прозрачный виджет.) Если я избавлюсь от «setAttribute», «setWindowFlags», появится треугольник. Есть ли недостаток в коде?

+0

Возможный дубликат [Qt Widget с прозрачным фоном] (http://stackoverflow.com/questions/7667552/qt-widget-with-transparent-background) –

ответ

1

Перевод сделан на Python с this C++ solution. Точка с запятой на конце была удалена, :: был заменен на ., а True был капитализирован. Основным источником трудности является то, что setAttribute и setWindowFlags являются фактически методами QGLWidget, поэтому добавлено self.. Просто добавьте это в конструктор __init__() вашего QGLWidget`.

self.setAttribute(Qt.WA_TranslucentBackground, True) 

Вы можете добавить self.setWindowFlags (Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)

, если вы хотите, чтобы окно быть на вершине других и не имеют никакой структуры.

+0

Я пробовал, как вы и предлагали, но мне не удалось. Я написал свой код, так что вы можете проверить мою ошибку? –

+0

@ Hyun-geunKim Это работает для меня; какую ОС вы используете? Я думаю, что он не будет работать в Windows XP, потому что он не использует диспетчер окон компоновки. –

+0

Я использую Windows 7. Это означает, что в моей системе прозрачность невозможна? –

Смежные вопросы