Странно работающий QGridLayout
Я пишу проект на PyQt5, он состоит из нескольких окон. Сам проект уже на финальной стадии, поэтому я начал добавлять лейауты для окон. Со всеми окнами всё прошло отлично, кроме одного. Я всё ещё новичок в Qt, поэтому, потратив день на поиски решения, я сдался и пришёл сюда.
Я хочу, чтобы окно масштабировалось и выглядело так:
Но при попытке масштабировать окно получается так:
Почему-то, при попытке растянуть окно растёт только QLineEdit и только в длину. Что я делаю не так?
Вот код:
class Ui_Append(object):
def setupUi(self, AppendWindow):
AppendWindow.resize(500, 250)
self.centralwidget = QtWidgets.QWidget(AppendWindow)
self.centralwidget.setObjectName("centralwidget")
self.time = QtWidgets.QTimeEdit(self.centralwidget)
self.time.setGeometry(QtCore.QRect(50, 85, 170, 40))
self.time.setObjectName("timeEditWidget")
font = QtGui.QFont('Times new roman', 16)
font.setBold(True)
self.time.setFont(font)
self.time.setMinimumWidth(170)
self.lable_1 = QtWidgets.QLabel(self.centralwidget)
self.lable_1.setGeometry(QtCore.QRect(50, 40, 170, 40))
self.lable_1.setObjectName("lable_1Widget")
font = QtGui.QFont('Times new roman', 16)
font.setBold(True)
self.lable_1.setFont(font)
self.lable_1.setText('Выберите время')
self.lable_1.setMinimumWidth(170)
self.line = QtWidgets.QLineEdit(self.centralwidget)
self.line.setGeometry(QtCore.QRect(280, 85, 170, 40))
self.line.setObjectName("lineEditWidget")
font = QtGui.QFont('Times new roman', 16)
font.setBold(True)
self.line.setFont(font)
self.line.setMinimumWidth(170)
self.lable_2 = QtWidgets.QLabel(self.centralwidget)
self.lable_2.setGeometry(QtCore.QRect(280, 40, 170, 40))
self.lable_2.setObjectName("lable_2Widget")
font = QtGui.QFont('Times new roman', 16)
font.setBold(True)
self.lable_2.setFont(font)
self.lable_2.setText('Введите значение')
self.lable_2.setMinimumWidth(170)
self.push = QtWidgets.QPushButton(self.centralwidget)
self.push.setGeometry(QtCore.QRect(160, 160, 180, 40))
font = QtGui.QFont('Times new roman', 16)
font.setBold(True)
self.push.setFont(font)
self.push.setText('Подтвердить')
self.push.setMinimumWidth(180)
AppendWindow.setCentralWidget(self.centralwidget)
class AppendWindow(QMainWindow, Ui_Append):
def __init__(self, parent=None):
super(AppendWindow, self).__init__(parent)
self.parent = parent
self.setupUi(self)
self.setWindowTitle('Новая запись')
self.push.clicked.connect(self.get_value)
self.grid = QtWidgets.QGridLayout(self.centralwidget)
self.grid.setContentsMargins(20, 20, 20, 20)
self.grid.setHorizontalSpacing(20)
self.grid.setVerticalSpacing(20)
self.grid.setRowStretch(0, 0)
self.grid.setRowStretch(1, 1)
self.grid.addWidget(self.lable_1, 0, 0)
self.grid.addWidget(self.lable_2, 0, 1)
self.grid.addWidget(self.time, 1, 0)
self.grid.addWidget(self.line, 1, 1, 1, 1)
self.grid.addWidget(self.push, 2, 0, 2, 2, alignment=Qt.AlignCenter)
def get_value(self):
value = self.line.text()
time = self.time.text()
try:
con = sqlite3.connect('notes.sqlite')
cur = con.cursor()
name = self.parent.comboBox.currentText()
data = self.parent.label_2.text()
data = data[-10:]
id = cur.execute("""SELECT id FROM users WHERE name = ?""", (name,)).fetchall()
t = cur.execute("""SELECT time FROM note WHERE user = ? AND data = ? AND time = ?""", (id[0][0], data, time)).fetchall()
if len(t) > 0:
raise NewException
if ',' in value and value.count(',') == 1:
m = value.find(',')
value = value[:m] + '.' + value[m + 1:]
value = float(value)
if value <= 0 or value > 55.5:
raise Exception
value = str(value)
self.parent.save(time, value)
self.close()
except NewException:
msgBox = QMessageBox()
msgBox.setIcon(QMessageBox.Information)
msgBox.setWindowTitle("Ошибка")
msgBox.addButton('ок', QMessageBox.AcceptRole)
msgBox.setText("Запись на это время уже существует. Пожалуйста измените время"
"или очистите день и внесите данные снова")
msgBox.exec_()
except Exception:
msgBox = QMessageBox()
msgBox.setIcon(QMessageBox.Information)
msgBox.setWindowTitle("Ошибка")
msgBox.addButton('ок', QMessageBox.AcceptRole)
msgBox.setText("Вы некорректно ввели значение. "
"Значение должно быть десятичным числом меньшим 55.5 "
"и большим 0.0 (Так как значений меньше 0.0 и больше "
"55.5 у живого человека быть не может.). Введите другое значение.")
msgBox.exec_()
Ответы (1 шт):
void QGridLayout::setRowStretch(int row, int stretch)
Устанавливает коэффициент растяжения
stretchстрокиrow. Первая строка - это номер 0. Коэффициент растяжения относится к другим строкам в этой сетке. Ряды с более высоким коэффициентом растяжения занимают больше доступного места.Коэффициент растяжения по умолчанию равен 0. Если коэффициент растяжения равен 0 и никакая другая строка в этой таблице не может расти вообще, строка все равно может расти.
void QGridLayout::setColumnStretch(int column, int stretch)
Устанавливает коэффициент растяжения
stretchдля столбцаcolumn. Первый столбец - номер 0.Коэффициент растяжения относится к другим столбцам в этой сетке. Столбцы с более высоким коэффициентом растяжения занимают больше доступного пространства.
Коэффициент растяжения по умолчанию равен 0. Если коэффициент растяжения равен 0 и ни один другой столбец в этой таблице не может увеличиваться вообще, столбец может увеличиваться.
import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.Qt import *
class Ui_Append(object):
def setupUi(self, AppendWindow):
AppendWindow.resize(500, 250)
self.centralwidget = QtWidgets.QWidget(AppendWindow)
self.centralwidget.setObjectName("centralwidget")
self.time = QtWidgets.QTimeEdit(self.centralwidget)
self.time.setGeometry(QtCore.QRect(50, 85, 170, 40))
self.time.setObjectName("timeEditWidget")
font = QtGui.QFont('Times new roman', 16)
font.setBold(True)
self.time.setFont(font)
self.time.setMinimumWidth(170)
self.lable_1 = QtWidgets.QLabel(self.centralwidget)
self.lable_1.setGeometry(QtCore.QRect(50, 40, 170, 40))
self.lable_1.setObjectName("lable_1Widget")
font = QtGui.QFont('Times new roman', 16)
font.setBold(True)
self.lable_1.setFont(font)
self.lable_1.setText('Выберите время')
self.lable_1.setMinimumWidth(170)
self.line = QtWidgets.QLineEdit(self.centralwidget)
self.line.setGeometry(QtCore.QRect(280, 85, 170, 40))
self.line.setObjectName("lineEditWidget")
font = QtGui.QFont('Times new roman', 16)
font.setBold(True)
self.line.setFont(font)
self.line.setMinimumWidth(170)
self.lable_2 = QtWidgets.QLabel(self.centralwidget)
self.lable_2.setGeometry(QtCore.QRect(280, 40, 170, 40))
self.lable_2.setObjectName("lable_2Widget")
font = QtGui.QFont('Times new roman', 16)
font.setBold(True)
self.lable_2.setFont(font)
self.lable_2.setText('Введите значение')
self.lable_2.setMinimumWidth(170)
self.push = QtWidgets.QPushButton(self.centralwidget)
self.push.setGeometry(QtCore.QRect(160, 160, 180, 40))
font = QtGui.QFont('Times new roman', 16)
font.setBold(True)
self.push.setFont(font)
self.push.setText('Подтвердить')
self.push.setMinimumWidth(180)
AppendWindow.setCentralWidget(self.centralwidget)
class AppendWindow(QMainWindow, Ui_Append):
def __init__(self, parent=None):
super(AppendWindow, self).__init__(parent) # ??? parent
self.parent = parent
self.setupUi(self)
self.setWindowTitle('Новая запись')
self.push.clicked.connect(self.get_value)
self.grid = QtWidgets.QGridLayout(self.centralwidget)
self.grid.setContentsMargins(20, 20, 20, 20)
self.grid.setHorizontalSpacing(20)
self.grid.setVerticalSpacing(20)
self.grid.setRowStretch(0, 1) # +++ 1
self.grid.setRowStretch(1, 1)
self.grid.setRowStretch(2, 1) # +++
self.grid.setRowStretch(3, 1) # +++
self.grid.setColumnStretch(0, 1) # +++
self.grid.setColumnStretch(1, 1) # +++
self.grid.addWidget(self.lable_1, 0, 0)
self.grid.addWidget(self.lable_2, 0, 1)
self.grid.addWidget(self.time, 1, 0)
self.grid.addWidget(self.line, 1, 1, 1, 1)
self.grid.addWidget(self.push, 2, 0, 2, 2, alignment=Qt.AlignCenter)
def get_value(self):
value = self.line.text()
time = self.time.text()
try:
con = sqlite3.connect('notes.sqlite')
cur = con.cursor()
name = self.parent.comboBox.currentText()
data = self.parent.label_2.text()
data = data[-10:]
id = cur.execute("""SELECT id FROM users WHERE name = ?""", (name,)).fetchall()
t = cur.execute("""SELECT time FROM note WHERE user = ? AND data = ? AND time = ?""", (id[0][0], data, time)).fetchall()
if len(t) > 0:
raise NewException
if ',' in value and value.count(',') == 1:
m = value.find(',')
value = value[:m] + '.' + value[m + 1:]
value = float(value)
if value <= 0 or value > 55.5:
raise Exception
value = str(value)
self.parent.save(time, value)
self.close()
except NewException:
msgBox = QMessageBox()
msgBox.setIcon(QMessageBox.Information)
msgBox.setWindowTitle("Ошибка")
msgBox.addButton('ок', QMessageBox.AcceptRole)
msgBox.setText("Запись на это время уже существует. Пожалуйста измените время"
"или очистите день и внесите данные снова")
msgBox.exec_()
except Exception:
msgBox = QMessageBox()
msgBox.setIcon(QMessageBox.Information)
msgBox.setWindowTitle("Ошибка")
msgBox.addButton('ок', QMessageBox.AcceptRole)
msgBox.setText("Вы некорректно ввели значение. "
"Значение должно быть десятичным числом меньшим 55.5 "
"и большим 0.0 (Так как значений меньше 0.0 и больше "
"55.5 у живого человека быть не может.). Введите другое значение.")
msgBox.exec_()
if __name__ == "__main__":
app = QApplication(sys.argv)
w = AppendWindow()
w.show()
sys.exit(app.exec_())


