Python PyQt5: добавление виджетов в макет приложения с использованием параметров строки меню - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь создать приложение GUI, использующее библиотеку PyQt5, которое принимает матрицу в качестве входных данных и в зависимости от выбранной пользователем опции отображает продукт или сумму.

Теперь я хочу, чтобы пользователь выбрал операцию, которую он хочет сделать (сложение или умножение), выбрав эту опцию на вкладке «Режим» в строке меню (которую я уже кодировал)

enter image description here

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

class Window(QMainWindow):

     def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(100, 100, 596, 226)
        self.setMinimumSize(QtCore.QSize(596, 226))
        self.setMaximumSize(QtCore.QSize(596, 226))
        self.setWindowTitle("Matrix Multiplication")

        # Creating the Menu Bar
        # Defining 'Modes' Menu option
        mainMenu = self.menuBar()
        modeMenu = mainMenu.addMenu("&Mode")

        # Defining options for 'Mode' Menu and adding them under the 'Mode' Menu
        # Matrix Multiplication Mode
        MatrixMultiplication_FileAction = QtWidgets.QAction("&Matrix Multiplication", self)
        MatrixMultiplication_FileAction.setShortcut("Ctrl+M")
        MatrixMultiplication_FileAction.setStatusTip("Activate Matrix Multiplication Module?")
        MatrixMultiplication_FileAction.triggered.connect(self.MatrixMultiplication_FileAction_Action) #todo
        modeMenu.addAction(MatrixMultiplication_FileAction)

        # Matrix Addition Mode
        MatrixAddition_FileAction = QtWidgets.QAction("&Matrix Addition", self)
        MatrixAddition_FileAction.setShortcut("Ctrl+A")
        MatrixAddition_FileAction.setStatusTip("Activate Matrix Addition Module?")
        MatrixAddition_FileAction.triggered.connect(self.MatrixAddition_FileAction_Action) #todo
        modeMenu.addAction(MatrixAddition_FileAction)

        self.statusBar()
        self.statusBar().showMessage("Ready")

        self.show()

        # Intro Message to explain how to use application
        message = QtWidgets.QMessageBox.information(self, "Introduction",
                                                    "Welcome to the Matrixion App\nTo run calculations, click the Menu Bar\nabove and select desired option")

    # Matrix Multiplication Module
    def MatrixMultiplication_FileAction_Action(self):
        self.statusBar().showMessage("Matrix Multiplication Module is Activated")

        # Defining the layout of all objects in Matrix Multiplication Module
        # Defining font for Header
        font = QtGui.QFont()
        font.setPointSize(16)
        font.setBold(True)
        font.setWeight(75)

        # Placing Header
        self.label = QtWidgets.QLabel("Matrix Multiplication", self)
        self.WindowHeader.setGeometry(QtCore.QRect(-4, 0, 601, 41))
        self.WindowHeader.setFont(font)
        self.WindowHeader.setAutoFillBackground(True)
        self.WindowHeader.setAlignment(QtCore.Qt.AlignCenter)

        self.show()

    # Matrix Addition Module
    def MatrixAddition_FileAction_Action(self):
        self.statusBar().showMessage("Matrix Addition Module is Activated")
        message = QtWidgets.QMessageBox.critical(self, "Houston, we have a problem!", "This feature hasn't been added yet")


def run():
    app = QApplication(sys.argv)
    GUI = Window()
    sys.exit(app.exec_())

run()

Я уже использовал self.show () в своей __init __ (self): функции, которую я кодировал в строке меню.

Я думаю, что вызов self.show () снова в MatrixMultiplication_FileAction_Action (self): это проблема, но я не могу понять, как я могу обновить GUI (добавить объекты в макет) с помощью функции, которая вызывается, когда выбрана опция в строке меню.

Я могу заверить, что функция MatrixMultiplication_FileAction_Action (self) действительно вызывается при обновлении подсказки о состоянии. Однако объекты, которые я определил, не отображаются.

Также нет сообщения об ошибке.

ПРИМЕЧАНИЕ. Приложение не завершено, если я могу выяснить, как добавить этот ярлык, я могу добавить и другие объекты

1 Ответ

0 голосов
/ 15 апреля 2020

Как сказано в Qt Main Window Framework , создание главного окна без центрального виджета не поддерживается. У вас должен быть центральный виджет, даже если это просто заполнитель. Чтобы увидеть ваш QLabel, создайте QWidget, который будет центральным виджетом главного окна. Вы также можете использовать менеджер макетов для обработки позиций виджетов.

class Window(QMainWindow):

    def __init__(self):
        ...
        w = QtWidgets.QWidget()
        self.setCentralWidget(w)
        self.grid = QtWidgets.QGridLayout(w)

    def MatrixMultiplication_FileAction_Action(self):
        ...
        self.label = QtWidgets.QLabel("Matrix Multiplication")
        self.grid.addWidget(self.label, 0, 0)

self.grid - указатель на QGridLayout, установленный в центральном виджете. Поэтому в функции MatrixMultiplication создайте QLabel без родителя, а затем добавьте его в макет.

Результат:

enter image description here

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