2017-04-17 49 views
1

對於一個Python項目,我必須繪製一個畫家在一個已經由圖片填充的Qlabel小部件上的圖像。我的問題是我的圖像系統地繪製在我的標籤背後。我這段代碼簡化了問題,我的目標是畫「cigale1.png」到「arrierplan.png」,這是在標籤:使用PyQt在QLabel上繪畫

from PyQt5 import QtCore, QtGui, QtWidgets 
import sys 
from test_ihm_main import * 


class MonAppli(QtWidgets.QMainWindow): 
    def __init__(self): 
     super().__init__() 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 
     self.ui.Label.setPixmap(QtGui.QPixmap("arrierplan.png")) 
     self.paintEvent(self.ui.Label) 

    def paintEvent(self,e): 
     qp = QtGui.QPainter(self) 
     qp.begin(self) 
     qp.drawPixmap(450,50,QtGui.QPixmap("cigale1.png")) 
     qp.end() 



if __name__ == "__main__": 
    app = QtWidgets.QApplication(sys.argv) 
    window = MonAppli() 
    window.show() 
    app.exec_() 

這裏是我的Ui_MainWindow類:

from PyQt5 import QtCore, QtGui, QtWidgets 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(800, 600) 
     self.centralwidget = QtWidgets.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 
     self.Quitter = QtWidgets.QPushButton(self.centralwidget) 
     self.Quitter.setGeometry(QtCore.QRect(670, 520, 113, 32)) 
     self.Quitter.setObjectName("Quitter") 
     self.Label = QtWidgets.QLabel(self.centralwidget) 
     self.Label.setGeometry(QtCore.QRect(400, 30, 361, 231)) 
     self.Label.setText("") 
     self.Label.setObjectName("Label") 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtWidgets.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22)) 
     self.menubar.setObjectName("menubar") 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtWidgets.QStatusBar(MainWindow) 
     self.statusbar.setObjectName("statusbar") 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     self.Quitter.clicked.connect(MainWindow.close) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     _translate = QtCore.QCoreApplication.translate 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) 
     self.Quitter.setText(_translate("MainWindow", "Quitter")) 

我讀過的文檔了很多,看了很多的話題,但沒有工作......

由於通過提前

TC

回答

2

問題出現是因爲QLabel高於QMainWindow,並且當您應用該函數時,將在該函數上繪製,因此不會顯示。

應該在QLabel中覆蓋paintEvent函數,爲此我們將創建一個從Qlabel繼承的名爲Label的類。

class Label(QtWidgets.QLabel): 
    def __init__(self, parent=None): 
     super(Label, self).__init__(parent=parent) 

    def paintEvent(self, e): 
     super().paintEvent(e) 
     qp = QtGui.QPainter(self) 
     qp.drawPixmap(100,100,QtGui.QPixmap("cigale1.png")) 

爲了能夠使用它改變類Ui_MainWindow的文件中添加它,你必須改變:

self.Label = Label(self.centralwidget) 

self.Label = QtWidgets.Qlabel(self.centralwidget) 

完整代碼:

test_ihm_main.py

from PyQt5 import QtCore, QtGui, QtWidgets 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(800, 600) 
     self.centralwidget = QtWidgets.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 
     self.Quitter = QtWidgets.QPushButton(self.centralwidget) 
     self.Quitter.setGeometry(QtCore.QRect(670, 520, 113, 32)) 
     self.Quitter.setObjectName("Quitter") 
     self.Label = Label(self.centralwidget) 
     self.Label.setGeometry(QtCore.QRect(400, 30, 361, 231)) 
     self.Label.setText("") 
     self.Label.setObjectName("Label") 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtWidgets.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22)) 
     self.menubar.setObjectName("menubar") 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtWidgets.QStatusBar(MainWindow) 
     self.statusbar.setObjectName("statusbar") 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     self.Quitter.clicked.connect(MainWindow.close) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     _translate = QtCore.QCoreApplication.translate 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) 
     self.Quitter.setText(_translate("MainWindow", "Quitter")) 


class Label(QtWidgets.QLabel): 
    def __init__(self, parent=None): 
     super(Label, self).__init__(parent=parent) 

    def paintEvent(self, e): 
     super().paintEvent(e) 
     qp = QtGui.QPainter(self) 
     qp.drawPixmap(100,100,QtGui.QPixmap("cigale1.png")) 

的.py

from PyQt5 import QtCore, QtGui, QtWidgets 
import sys 
from test_ihm_main import * 


class MonAppli(QtWidgets.QMainWindow): 
    def __init__(self): 
     super().__init__() 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 
     self.ui.Label.setPixmap(QtGui.QPixmap("arrierplan.png")) 


if __name__ == "__main__": 
    app = QtWidgets.QApplication(sys.argv) 
    window = MonAppli() 
    window.show() 
    app.exec_() 

結果:

arrierplan.png

enter image description here

cigale1.png

enter image description here

輸出

enter image description here