gpt4 book ai didi

python - PyQT5 正确布局对齐

转载 作者:太空宇宙 更新时间:2023-11-04 02:27:43 24 4
gpt4 key购买 nike

我的 PyQt5 GUI 有以下代码:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QCalendarWidget, QMainWindow, QGridLayout, QLayout, QTableWidget, QHeaderView, QLabel, QHBoxLayout, QVBoxLayout, QLineEdit, QComboBox
from PyQt5.QtCore import QDate, Qt
from datetime import date, datetime


class CalendarWindow(QMainWindow):
def __init__(self, parent=None):
super(CalendarWindow, self).__init__(parent)
self.setUpUI()

def setUpUI(self):
self.setGeometry(50, 50, 1200, 700)
# Labels
self.label_events = QLabel(self)
self.label_new_event = QLabel(self)
self.label_event_name = QLabel(self)
self.label_start_date = QLabel(self)
self.label_repeat = QLabel(self)
self.label_description = QLabel(self)
# Labels parameters
self.label_events.setAlignment(Qt.AlignCenter)
self.label_events.setText("Wydarzenia danego dnia:")

# self.label_new_event.setAlignment(Qt.AlignCenter)
self.label_new_event.setText("Dodaj event:")

self.label_event_name.setText("Nazwa eventu:")
self.label_start_date.setText("Data eventu:")
self.label_repeat.setText("Powtarzalność eventu:")
self.label_description.setText("Opis:")
# TextEdits
self.text_event_name = QLineEdit(self)
self.text_start_date = QLineEdit(self)
self.text_description = QLineEdit(self)
# TextEdits parameters

# ComboBoxes
self.combo_repeat = QComboBox(self)
# ComboBoxes parameters
self.combo_repeat.addItems(
["No", "Day", "Week", "Two weeks", "Month", "Half a year", "Year"])

# Widgets
self.setWindowTitle("Python Calendar App")
self.calendar_widget = QCalendarWidget(self)
# User date select event
self.calendar_widget.clicked[QDate].connect(self.dateChanged)
self.events_list_widget = QTableWidget(self)
self.events_list_widget.setColumnCount(5)
self.events_list_widget.setHorizontalHeaderLabels(
["ID", "Name", "Date", "Repetition", "Description"])
# Columns stretched and fit
self.events_list_widget.horizontalHeader().setSectionResizeMode(
QHeaderView.Stretch)
self.main_widget = QWidget(self)
self.main_layout = QGridLayout(self.main_widget)
self.main_layout.sizeConstraint = QLayout.SetDefaultConstraint
self.main_layout.addWidget(self.calendar_widget, 0, 0)
self.init_sublayouts()
self.main_layout.addLayout(self.sublayout_events, 0, 1)
self.main_layout.addLayout(self.sublayout_new_event, 0, 2)
self.main_layout.setColumnStretch(0, 1)
self.main_layout.setColumnStretch(1, 3)
self.main_layout.setColumnStretch(2, 2)
self.main_widget.setLayout(self.main_layout)
self.setCentralWidget(self.main_widget)

def init_sublayouts(self):
# Events sublayout
self.sublayout_events = QVBoxLayout()
self.sublayout_events.addWidget(self.label_events)
self.sublayout_events.addWidget(self.events_list_widget)
# New event sublayout
self.sublayout_new_event = QVBoxLayout()
self.sublayout_new_event.addWidget(self.label_new_event)
self.sublayout_new_event_grid = QGridLayout()
self.sublayout_new_event_grid.addWidget(self.label_event_name, 1, 0)
self.sublayout_new_event_grid.addWidget(self.text_event_name, 1, 1)
self.sublayout_new_event_grid.addWidget(self.label_start_date, 2, 0)
self.sublayout_new_event_grid.addWidget(self.text_start_date, 2, 1)
self.sublayout_new_event_grid.addWidget(self.label_repeat, 3, 0)
self.sublayout_new_event_grid.addWidget(self.combo_repeat, 3, 1)
self.sublayout_new_event_grid.addWidget(self.label_description, 4, 0)
self.sublayout_new_event_grid.addWidget(self.text_description, 4, 1)
self.sublayout_new_event.addLayout(self.sublayout_new_event_grid)

def dateChanged(self, qdate):
print("Date changed to:", self.getDaysEvents())
selected_date = self.getDaysEvents()
# self.events_list_widget.addItem(selected_date.strftime("%d/%m/%y"))

def getDaysEvents(self):
selected_date = self.calendar_widget.selectedDate()
return selected_date.toPyDate()


if __name__ == '__main__':
app = QApplication(sys.argv)
foo = CalendarWindow()
foo.show()
sys.exit(app.exec_())

当你启动它时,它看起来像这样:

enter image description here

我对第 3 列有疑问。我希望 Dodaj event: 标签位于顶部,那些带有标签的文本框位于其下方不远处。相关代码在#New event sublayout注释下的init_sublayouts中。我试图将这些文本框制作成 QGridLayoutDodaj 事件,并将此 QGridLayout 制作成 QVBoxLabout,但你看到发生了什么.我还尝试让我的 QGridLayout 的每一行成为一个单独的 QHBoxLayout,结果是一样的。有办法吗?我在第 2 列中做了类似的事情,其中​​我有一个 QLabel 堆叠在 QTableWidget 之上,但在第 3 列中它似乎没有按预期工作。

最佳答案

void QBoxLayout::addStretch(int stretch = 0)添加一个最小尺寸为零且拉伸(stretch)因子为 stretch 的可拉伸(stretch)空间(QSpacerItem)到此框布局的末尾。

试一试:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QCalendarWidget, QMainWindow, QGridLayout, QLayout, QTableWidget, QHeaderView, QLabel, QHBoxLayout, QVBoxLayout, QLineEdit, QComboBox
from PyQt5.QtCore import QDate, Qt
from datetime import date, datetime


class CalendarWindow(QMainWindow):
def __init__(self, parent=None):
super(CalendarWindow, self).__init__(parent)
self.setUpUI()

def setUpUI(self):
self.setGeometry(50, 50, 1200, 700)
# Labels
self.label_events = QLabel(self)
self.label_new_event = QLabel(self)
self.label_event_name = QLabel(self)
self.label_start_date = QLabel(self)
self.label_repeat = QLabel(self)
self.label_description = QLabel(self)
# Labels parameters
self.label_events.setAlignment(Qt.AlignCenter)
self.label_events.setText("Wydarzenia danego dnia:")

self.label_new_event.setAlignment(Qt.AlignCenter) # +
self.label_new_event.setText("Dodaj event:")

self.label_event_name.setText("Nazwa eventu:")
self.label_start_date.setText("Data eventu:")
self.label_repeat.setText("Powtarzalność eventu:")
self.label_description.setText("Opis:")
# TextEdits
self.text_event_name = QLineEdit(self)
self.text_start_date = QLineEdit(self)
self.text_description = QLineEdit(self)
# TextEdits parameters

# ComboBoxes
self.combo_repeat = QComboBox(self)
# ComboBoxes parameters
self.combo_repeat.addItems(
["No", "Day", "Week", "Two weeks", "Month", "Half a year", "Year"])

# Widgets
self.setWindowTitle("Python Calendar App")
self.calendar_widget = QCalendarWidget(self)
# User date select event
self.calendar_widget.clicked[QDate].connect(self.dateChanged)
self.events_list_widget = QTableWidget(self)
self.events_list_widget.setColumnCount(5)
self.events_list_widget.setHorizontalHeaderLabels(
["ID", "Name", "Date", "Repetition", "Description"])
# Columns stretched and fit
self.events_list_widget.horizontalHeader().setSectionResizeMode(
QHeaderView.Stretch)
self.main_widget = QWidget(self)
self.main_layout = QGridLayout(self.main_widget)
self.main_layout.sizeConstraint = QLayout.SetDefaultConstraint
self.main_layout.addWidget(self.calendar_widget, 0, 0)
self.init_sublayouts()
self.main_layout.addLayout(self.sublayout_events, 0, 1)
self.main_layout.addLayout(self.sublayout_new_event, 0, 2)
self.main_layout.setColumnStretch(0, 1)
self.main_layout.setColumnStretch(1, 3)
self.main_layout.setColumnStretch(2, 2)
self.main_widget.setLayout(self.main_layout)
self.setCentralWidget(self.main_widget)

def init_sublayouts(self):
# Events sublayout
self.sublayout_events = QVBoxLayout()
self.sublayout_events.addWidget(self.label_events)
self.sublayout_events.addWidget(self.events_list_widget)
# New event sublayout
self.sublayout_new_event = QVBoxLayout()
self.sublayout_new_event.addWidget(self.label_new_event)
self.sublayout_new_event.addStretch(1) # +

self.sublayout_new_event_grid = QGridLayout()
self.sublayout_new_event_grid.addWidget(self.label_event_name, 1, 0)
self.sublayout_new_event_grid.addWidget(self.text_event_name, 1, 1)
self.sublayout_new_event_grid.addWidget(self.label_start_date, 2, 0)
self.sublayout_new_event_grid.addWidget(self.text_start_date, 2, 1)
self.sublayout_new_event_grid.addWidget(self.label_repeat, 3, 0)
self.sublayout_new_event_grid.addWidget(self.combo_repeat, 3, 1)
self.sublayout_new_event_grid.addWidget(self.label_description, 4, 0)
self.sublayout_new_event_grid.addWidget(self.text_description, 4, 1)
self.sublayout_new_event.addLayout(self.sublayout_new_event_grid)
self.sublayout_new_event.addStretch(20) # +

def dateChanged(self, qdate):
print("Date changed to:", self.getDaysEvents())
selected_date = self.getDaysEvents()
# self.events_list_widget.addItem(selected_date.strftime("%d/%m/%y"))

def getDaysEvents(self):
selected_date = self.calendar_widget.selectedDate()
return selected_date.toPyDate()


if __name__ == '__main__':
app = QApplication(sys.argv)
foo = CalendarWindow()
foo.show()
sys.exit(app.exec_())

enter image description here

关于python - PyQT5 正确布局对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49959083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com