PyQt的显示不正确的像素图

问题描述 投票:0回答:2

所以,我是新来的PyQt,我似乎无法工作,相当出所有的缺陷。出于某种原因,每当我点击“玩游戏”按钮,图像只是不会出现。但是,它运行InitUI。谁能告诉我什么即时做错了什么? (当它刚装起来像最初的形象出现。

类实施例(的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())

类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_()) `
python qt pyqt pyqt5
2个回答
1
投票

你应该得到的Qt从一个有用的警告;如果没有,请检查您的测试环境具有积极的控制台。该警告是:

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

这发生在您创建QHBoxLayoutChessWidget.initUI并尝试父它的ChessWidget。您已设置在该小窗口QVBoxLayout

一个快速的解决方案是保留布局的名称(vbox - > self.vbox),然后在单击事件中删除从布局中QPushButton并添加ChessWidget

我明白你只是为了学习目的而作出小的考验,但与QPushButton这种设计模式被永久取代可能不是你想要的。如果你想在QPushButtonChessWidget占据相同的空间,看看QStackedWidget。这将允许你从一个小部件往往你想切换到另一个。这可能是一个有用的方法,如果你想隐藏ChessWidget后,当没有比赛是活动的,例如。

请注意,当您创建QPushButtonQLabel,这是不必要的,以他们父母的ChessWidget为增加时,他们会被重设父布局。


0
投票

试试吧:

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_())

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.