PyQt неправильно отображает растровое изображение - PullRequest
0 голосов
/ 04 февраля 2019

Так что я новичок в PyQt и не могу решить все проблемы.По какой-то причине, когда я нажимаю кнопку «играть в игру», изображение просто не появляется.Тем не менее, он запускает InitUI.Может кто-нибудь сказать мне, что я делаю не так?(когда он просто загрузил изображение изначально, изображение появилось.

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

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Попробуйте:

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

0 голосов
/ 04 февраля 2019

Вы должны получить полезное предупреждение от Qt;если нет, убедитесь, что в вашей тестовой среде активна консоль.Предупреждение:

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

Это происходит, когда вы создаете QHBoxLayout в ChessWidget.initUI и пытаетесь связать его с ChessWidget.Вы уже установили QVBoxLayout для этого виджета.

Быстрое решение - сохранить имя вашего макета (vbox -> self.vbox), а затем в событии щелчка удалить QPushButtonиз макета и добавьте ChessWidget.

Я понимаю, что вы просто делаете небольшие тесты для целей обучения, но этот шаблон проектирования с постоянно заменяемым QPushButton может оказаться не тем, что вам нужно.Если вы хотите, чтобы QPushButton и ChessWidget занимали одно и то же место, посмотрите на QStackedWidget.Это позволит вам переключаться с одного виджета на другой так часто, как вам нравится.Это может быть полезным, если вы хотите скрыть ChessWidget позже, когда ни одна игра не активна, например.

Обратите внимание, что когда вы создаете свои QPushButton и QLabel, нет необходимости в их родительской привязкев ChessWidget, так как они будут добавлены в макет при добавлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...