Перекрывающиеся виджеты QGridLayout - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь создать программу, в которой у пользователя есть три варианта ответа на вопрос. Для этого я использовал QGridLayout, но отображается только последний виджет, добавленный в QGridLayout.

Ожидаемое:

################################
#             Text             #
################################

########## ########## ##########
#Button 1# #Button 2# #Button 3#
########## ########## ##########

Reality:

##########
#Button 3#
##########

Упрощенный код Python 3 (без текстового виджета):

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

QApp = QApplication(sys.argv)

QMWRoot = QMainWindow()
QGLRoot = QGridLayout(QMWRoot)
QMWRoot.setLayout(QGLRoot)
QPB0 = QPushButton('B0x0', QMWRoot)
QGLRoot.addWidget(QPB0, 0, 0)
QPB1 = QPushButton('B0x1', QMWRoot)
QGLRoot.addWidget(QPB1, 0, 1)
QPB2 = QPushButton('B1x0', QMWRoot)
QGLRoot.addWidget(QPB2, 1, 0)
QMWRoot.show()

sys.exit(QApp.exec_())

Оригинал (Незаконченный) Python 3 Код:

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

class Root(QMainWindow):
    def __init__(self, QApp):
        super().__init__()
        self.QApp = QApp
    def setupUi(self):
        self.setWindowTitle('')
        self.QGLRoot = QGridLayout()
        self.setLayout(self.QGLRoot)

        self.QLBTool = QLabel()
        self.QLBTool.setText('Tool')
        self.QGLRoot.addWidget(self.QLBTool, 0, 0)
        self.QPB0 = QPushButton(self)
        self.QPB0.setText('0')
        self.QGLRoot.addWidget(self.QPB0, 1, 0)
        self.QPB1 = QPushButton(self)
        self.QPB1.setText('1')
        self.QGLRoot.addWidget(self.QPB1, 1, 1)
        self.QPB2 = QPushButton(self)
        self.QPB2.setText('2')
        self.QGLRoot.addWidget(self.QPB2, 1, 2)
    def startUi(self):
        self.show()
    def updateUi(self):
        pass

QApp = QApplication(sys.argv)

App = Root(QApp)
App.setupUi()
App.startUi()

sys.exit(QApp.exec_())

1 Ответ

0 голосов
/ 02 июля 2018

QMainWindow у вас есть специальная структура:

enter image description here

Так что в вашем случае вы должны установить центральный виджет и там разместить макет.

import sys

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


class Root(QMainWindow):
    def __init__(self, QApp):
        super().__init__()
        self.QApp = QApp

    def setupUi(self):
        self.setWindowTitle('')
        widget = QWidget()
        self.setCentralWidget(widget)

        self.QGLRoot = QGridLayout()
        widget.setLayout(self.QGLRoot)

        self.QLBTool = QLabel()
        self.QLBTool.setAlignment(Qt.AlignHCenter)
        self.QLBTool.setText('Tool')

        self.QGLRoot.addWidget(self.QLBTool, 0, 0, 1, 3)

        self.QPB0 = QPushButton()
        self.QPB0.setText('0')
        self.QGLRoot.addWidget(self.QPB0, 1, 0)
        self.QPB1 = QPushButton()
        self.QPB1.setText('1')
        self.QGLRoot.addWidget(self.QPB1, 1, 1)
        self.QPB2 = QPushButton()
        self.QPB2.setText('2')
        self.QGLRoot.addWidget(self.QPB2, 1, 2)

    def startUi(self):
        self.show()

QApp = QApplication(sys.argv)
App = Root(QApp)
App.setupUi()
App.startUi()
sys.exit(QApp.exec_())

enter image description here

Компактный и обобщенный код:

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, \
    QGridLayout, QLabel, QPushButton


class Root(QMainWindow):
    def __init__(self, QApp):
        super().__init__()
        self.setupUi()

    def setupUi(self):
        self.setWindowTitle('')

        widget = QWidget()
        self.setCentralWidget(widget)
        QGLRoot = QGridLayout(widget)

        options = ("0", "1", "2")

        QLBTool = QLabel('Tool')
        QLBTool.setAlignment(Qt.AlignHCenter)

        QGLRoot.addWidget(QLBTool, 0, 0, 1, len(options))

        for i, option in enumerate(options):
            button = QPushButton(option)
            QGLRoot.addWidget(button, 1, i)

QApp = QApplication(sys.argv)
App = Root(QApp)
App.show()
sys.exit(QApp.exec_())
...