#python #pyqt5 #qmainwindow
#python #pyqt5 #qmainwindow
Вопрос:
Для проекта в классе программирования нам нужно разработать приложение и использовать PYQT5 для графического интерфейса.
У меня есть класс, основанный на QMainWindow. Есть несколько строк кода, которые я не совсем понимаю. Ниже приведена инициализация:
# Snippet 1
class ApplicationWindow(QtWidgets.QMainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
# self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
self.setWindowTitle("Main Window")
Затем определяются следующие переменные / элементы графического интерфейса:
# Snippet 2
self.main_widget = QtWidgets.QWidget(self)
l = QtWidgets.QVBoxLayout(self.main_widget)
sc = MyStaticMplCanvas(width=5, height=4, dpi=100) # just some graph
dc = MyDynamicMplCanvas(width=5, height=4, dpi=100) # another graph
l.addWidget(sc)
l.addWidget(dc)
Затем я попытался добавить горизонтальный макет блока со следующим содержимым:
# Snippet 3
x = QtWidgets.QHBoxLayout(self.main_widget) # new
b1 = QtWidgets.QPushButton("Test1") # new
b2 = QtWidgets.QPushButton("Test2") # new
x.addWidget(p1) # new
x.addWidget(p2) # new
Наконец, создается центральный виджет:
# Snippet 4
self.main_widget.setFocus()
self.setCentralWidget(self.main_widget)
Сама программа не выдает ошибок и работает правильно. Но в окне отображаются только два графика из фрагмента 2. Если вы удалите
self.main_widget
От
l = QtWidgets.QVBoxLayout(self.main_widget)
и оставьте скобки пустыми, отображаются только кнопки в фрагменте 3.
В чем смысл следующего назначения?
self.main_widget = QtWidgets.QWidget(self)
Можете ли вы объединить вертикальный и горизонтальный макет блока в один и, следовательно, отобразить две кнопки, а также два графика в качестве центрального виджета?
Это был мой первоначальный план, и я попробовал некоторые вещи с помощью опций addLayout() и setLayout() и хотел добавить эти макеты в setCentralWidget(), но безуспешно.
У вас есть идея о том, как отобразить комбинацию макетов блоков multliple в качестве центрального виджета в классе, основанном на QMainWindow?
Большое вам спасибо. 🙂
Ответ №1:
Вы можете использовать вложенные макеты addLayout()
в макет; затем внутренний макет становится дочерним по отношению к макету, в который он вставлен.
class ApplicationWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
# self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
self.setWindowTitle("Main Window")
self.main_widget = QtWidgets.QWidget(self)
self.main_widget.setFocus()
self.setCentralWidget(self.main_widget)
l = QtWidgets.QVBoxLayout(self.main_widget)
sc = MyStaticMplCanvas(width=5, height=4, dpi=100) # just some graph
dc = MyDynamicMplCanvas(width=5, height=4, dpi=100) # another graph
l.addWidget(sc)
l.addWidget(dc)
# Snippet 3
x = QtWidgets.QHBoxLayout() # self.main_widget) # new
b1 = QtWidgets.QPushButton("Test1") # new
b2 = QtWidgets.QPushButton("Test2") # new
x.addWidget(b1) # new b1
x.addWidget(b2) # new b2
l.addLayout(x) # <----
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = ApplicationWindow()
MainWindow.show()
sys.exit(app.exec_())
Комментарии:
1. Удивительно! Это именно то, что я искал. Большое вам спасибо!