简体   繁体   中英

PyQt not displaying pixmap properly

So I'm new to PyQt and I can't seem to quite work out all the kinks. For some reason, whenever I click the "play game" button, the image just doesn't appear. However, it does run the InitUI . Can someone tell me what Im doing wrong? (when It just loaded up the image initially, the image appeared.

class Example(QMainWindow):

def __init__(self):
    super().__init__()

    self.title = 'PyQt5 image - pythonspot.com'
    self.initUI()

def initUI(self):

    central_widget = QWidget()
    self.chess = ChessWidget(central_widget)
    self.setCentralWidget(central_widget)
    self.setWindowIcon(QIcon('web.png'))
    self.resize(900,900)
    self.center()
    self.setFixedSize(self.size())
    self.show()

def toggleMenu(self, state):

    if state:
        self.statusbar.show()
    else:
        self.statusbar.hide()

# def closeEvent(self, event):
#
#     reply = QMessageBox.question(self, 'Message',
#                                  """Are you sure you want to quit?""", QMessageBox.Yes |
#                                  QMessageBox.No, QMessageBox.No)
#
#     if reply == QMessageBox.Yes:
#         event.accept()
#     else:
#         event.ignore()

def center(self):

    qr = self.frameGeometry()
    cp = QDesktopWidget().availableGeometry().center()
    qr.moveCenter(cp)
    self.move(qr.topLeft())

class ChessWidget(QFrame):

def __init__(self, parent):
    super().__init__(parent)
    qbtn = QPushButton('Play Game', self)
    qbtn.clicked.connect(lambda: qbtn.close())
    qbtn.clicked.connect(lambda: self.initUI())
    qbtn.resize(qbtn.sizeHint())

    hbox = QHBoxLayout()
    hbox.addStretch(1)
    hbox.addWidget(qbtn)
    vbox = QVBoxLayout()
    vbox.addStretch(1)
    vbox.addLayout(hbox)
    self.setLayout(vbox)

def initUI(self):
     print("hi")
     pixmap = QPixmap("ChessBoard.jpg")
     lbl = QLabel(self)
     pixmap2 = pixmap.scaledToWidth(900)
     hbox = QHBoxLayout(self)
     hbox.addStretch(1)
     hbox.addWidget(lbl)
     lbl.setPixmap(pixmap2) ` if __name__ == '__main__':
app = QApplication([])
ex = Example()
sys.exit(app.exec_()) `

You should be getting a useful warning from Qt; if not, check that your test environment has a console active. The warning is:

QLayout: Attempting to add QLayout "" to ChessWidget "", which already has a layout

This happens when you create the QHBoxLayout in ChessWidget.initUI and try to parent it to the ChessWidget . You have already set a QVBoxLayout on that widget.

A quick solution is to retain the name of your layout ( vbox -> self.vbox ), then in a click event remove the QPushButton from the layout and add the ChessWidget .

I understand you're just making small tests for learning purposes, but this design pattern with the QPushButton being permanently replaced might not be what you want. If you want the QPushButton and ChessWidget to occupy the same space, look at QStackedWidget . This will allow you to switch from one widget to the other as often as you like. This could be a useful approach if you want to hide the ChessWidget later when no game is active, for example.

Note that when you create your QPushButton and QLabel , it's unnecessary to parent them to the ChessWidget as they will be reparented to the layout when added.

Try it:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore    import *
from PyQt5.QtGui     import *

class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        central_widget = QWidget()
        self.chess     = ChessWidget(central_widget)   
        self.setCentralWidget(central_widget)

        self.layV = QVBoxLayout(central_widget)               # +++
        self.layV.addWidget(self.chess)                       # +++

        self.setWindowIcon(QIcon('D:/_Qt/img/py-qt.png')) # web.png
        self.resize(440,440)    #(900,900)

class ChessWidget(QFrame): 
    def __init__(self, parent=None):
        super().__init__(parent)

        qbtn = QPushButton('Play Game', self)
        qbtn.clicked.connect(lambda: qbtn.close())
        qbtn.clicked.connect(lambda: self.initUI())

        self.hbox = QHBoxLayout()  
        self.hbox.addWidget(qbtn)
        self.vbox = QVBoxLayout()
        self.vbox.addStretch(1)
        self.vbox.addLayout(self.hbox)
        self.setLayout(self.vbox)

    def initUI(self):
        print("hi")
        pixmap = QPixmap("D:/_Qt/img/pyqt.jpg") # ChessBoard.jpg
        lbl    = QLabel(self)
        self.vbox.addWidget(lbl)
        lbl.setPixmap(pixmap.scaled(400, 400, Qt.KeepAspectRatio))  # +++

if __name__ == '__main__':
    app = QApplication([])
    ex = Example()
    ex.setWindowTitle('PyQt5 image - pythonspot.com')
    ex.show()
    sys.exit(app.exec_())

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM