我英语不好,所以文档对我没有帮助,我在俄语论坛上找不到合适的解决方案。
问题的症结在于我有几个小部件(两个 QLabels,QLineEdit 和 QTimeEdit),我希望它们在调整窗口大小时根据更改进行缩放,但同时它们必须相对于每个小部件保持在相同的位置其他。那些。例如,我希望在两个 QLabel 等之间具有相同的可扩展空白空间。
我附上整个项目的代码,我感兴趣的窗口在AppendWindow类中,它继承了Ui_Append类的UI。
from sys import argv, exit
from os import remove
import sqlite3
from PyQt5.QtWidgets import QApplication, QMainWindow, QInputDialog, QMessageBox, QCalendarWidget
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(891, 574)
palette = QtGui.QPalette()
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(245, 128, 64))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(245, 128, 64))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)
brush = QtGui.QBrush(QtGui.QColor(245, 128, 64))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(245, 128, 64))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)
MainWindow.setPalette(palette)
MainWindow.setStyleSheet("")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.comboBox = QtWidgets.QComboBox(self.centralwidget)
self.comboBox.setGeometry(QtCore.QRect(20, 60, 411, 41))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(14)
font.setBold(True)
font.setWeight(75)
self.comboBox.setFont(font)
self.comboBox.setObjectName("comboBox")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(20, 10, 411, 31))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(18)
font.setBold(True)
font.setWeight(75)
self.label.setFont(font)
self.label.setWordWrap(False)
self.label.setObjectName("label")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(20, 120, 411, 41))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(16)
font.setBold(True)
font.setWeight(75)
self.pushButton.setFont(font)
self.pushButton.setObjectName("pushButton")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(500, 100, 361, 41))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(20)
font.setBold(True)
font.setWeight(75)
self.label_2.setFont(font)
self.label_2.setObjectName("label_2")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(20, 180, 411, 41))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(18)
font.setBold(True)
font.setWeight(75)
self.pushButton_2.setFont(font)
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setGeometry(QtCore.QRect(20, 240, 411, 41))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(18)
font.setBold(True)
font.setWeight(75)
self.pushButton_3.setFont(font)
self.pushButton_3.setObjectName("pushButton_3")
self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_4.setGeometry(QtCore.QRect(20, 360, 411, 41))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(18)
font.setBold(True)
font.setWeight(75)
self.pushButton_4.setFont(font)
self.pushButton_4.setObjectName("pushButton_4")
self.label_4 = QtWidgets.QLabel(self.centralwidget)
self.label_4.setGeometry(QtCore.QRect(20, 440, 271, 41))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(22)
font.setBold(True)
font.setWeight(75)
self.label_4.setFont(font)
self.label_4.setObjectName("label_4")
self.label_5 = QtWidgets.QLabel(self.centralwidget)
self.label_5.setGeometry(QtCore.QRect(330, 430, 101, 61))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(26)
font.setBold(True)
font.setWeight(75)
self.label_5.setFont(font)
self.label_5.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.label_5.setObjectName("label_5")
self.listView = QtWidgets.QListView(self.centralwidget)
self.listView.setGeometry(QtCore.QRect(500, 150, 361, 351))
self.listView.setObjectName("listView")
self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_5.setGeometry(QtCore.QRect(500, 20, 361, 51))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(16)
font.setBold(True)
font.setWeight(75)
font.setStyleStrategy(QtGui.QFont.PreferAntialias)
self.pushButton_5.setFont(font)
self.pushButton_5.setStyleSheet("background-color: rgb(250, 30, 30);")
self.pushButton_5.setObjectName("pushButton_5")
self.pushButton_6 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_6.setGeometry(QtCore.QRect(20, 300, 411, 41))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(20)
font.setBold(True)
font.setWeight(75)
self.pushButton_6.setFont(font)
self.pushButton_6.setObjectName("pushButton_6")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 891, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "DiaNotes"))
self.label.setText(_translate("MainWindow", "Текущий пользователь"))
self.pushButton.setText(_translate("MainWindow", "Создать нового пользователя"))
self.label_2.setText(_translate("MainWindow", "Дата записи: 01.01.2021"))
self.pushButton_2.setText(_translate("MainWindow", "Изменить дату"))
self.pushButton_3.setText(_translate("MainWindow", "Добавить новое значение"))
self.pushButton_4.setText(_translate("MainWindow", "Построить график"))
self.label_4.setText(_translate("MainWindow", "Среднее значение:"))
self.label_5.setText(_translate("MainWindow", "0.0"))
self.pushButton_5.setText(_translate("MainWindow", "Удалить текущего пользователя"))
self.pushButton_6.setText(_translate("MainWindow", "Очистить"))
class MyWidget(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.lable_2 = self.label_2
self.w2 = CalendarWindow(self)
self.w3 = AppendWindow(self)
self.pushButton.clicked.connect(self.new_user)
self.pushButton_5.clicked.connect(self.dellete_user)
self.pushButton_2.clicked.connect(self.change_data)
self.pushButton_3.clicked.connect(self.append_note)
try:
f = open('notes.sqlite', mode='r')
f.close()
con = sqlite3.connect('notes.sqlite')
cur = con.cursor()
users = cur.execute("""SELECT name FROM users""").fetchall()
if len(users) == 0:
remove('notes.sqlite')
raise Exception
except Exception:
con = sqlite3.connect('notes.sqlite')
cur = con.cursor()
try:
cur.execute("""CREATE TABLE users (name text, id int)""")
except Exception:
pass
cur.execute("""INSERT INTO users VALUES ('default_user', 1)""")
con.commit()
try:
cur.execute("""CREATE TABLE note (user int, data text, time text, value float)""")
except Exception:
pass
cur.execute("""INSERT INTO note VALUES (1, '01.01.2021', '0:00', 5.0)""")
con.commit()
con = sqlite3.connect('notes.sqlite')
cur = con.cursor()
users = cur.execute("""SELECT name FROM users""").fetchall()
users = list(map(lambda x: x[0], users))
self.comboBox.addItems(users)
def new_user(self):
name, ok_pressed = QInputDialog.getText(self, "Введите имя",
"Введите имя нового пользователя")
if ok_pressed:
self.comboBox.addItem(name)
self.comboBox.setCurrentText(name)
con = sqlite3.connect('notes.sqlite')
cur = con.cursor()
ind = cur.execute("""SELECT id FROM users""").fetchall()
ind = 1 + int(ind[-1][-1])
cur.execute("""INSERT INTO users VALUES (?, ?)""", (name, ind))
con.commit()
def dellete_user(self):
a = []
for i in range(self.comboBox.count()):
a.append(self.comboBox.itemText(i))
if len(a) > 1:
msgBox = QMessageBox()
msgBox.setIcon(QMessageBox.Information)
msgBox.setWindowTitle("Вы уверены?")
ok = msgBox.addButton('да', QMessageBox.AcceptRole)
msgBox.addButton('нет', QMessageBox.RejectRole)
msgBox.setText("Вы действительно хотите удалить нынешнего пользователя?")
msgBox.exec_()
if msgBox.clickedButton() == ok:
ind = self.comboBox.currentIndex()
us = self.comboBox.currentText()
con = sqlite3.connect('notes.sqlite')
cur = con.cursor()
res = cur.execute("""DELETE FROM note WHERE user = (SELECT id FROM users WHERE name = ?)""", (us,))
res = cur.execute("""DELETE FROM users WHERE name = ?""", (us,))
con.commit()
self.comboBox.removeItem(ind)
else:
msgBox = QMessageBox()
msgBox.setIcon(QMessageBox.Information)
msgBox.setWindowTitle("Ошибка")
msgBox.addButton('ок', QMessageBox.AcceptRole)
msgBox.setText("В списке всего один пользователь, его нельзя удалить. "
"Если вы хотите удалить этого пользователя, то создайте "
"нового, а после удалите этого")
msgBox.exec_()
def change_data(self):
self.w2.show()
def append_note(self):
self.w3.show()
class Ui_Calendar(object):
def setupUi(self, CalendarWindow):
CalendarWindow.resize(574, 574)
self.centralwidget = QtWidgets.QWidget(CalendarWindow)
self.centralwidget.setObjectName("centralwidget")
self.calendar = QtWidgets.QCalendarWidget(self.centralwidget)
self.calendar.setGeometry(QtCore.QRect(37, 74, 500, 500))
self.calendar.setObjectName("calendarWidget")
self.pushButton_7 = QtWidgets.QPushButton("Подтвердить", self.centralwidget)
self.pushButton_7.setGeometry(QtCore.QRect(207, 25, 160, 40))
self.pushButton_7.setObjectName("pushButton_7")
font = QtGui.QFont('Times new roman', 16)
font.setBold(True)
self.pushButton_7.setFont(font)
CalendarWindow.setCentralWidget(self.centralwidget)
class CalendarWindow(QMainWindow, Ui_Calendar):
def __init__(self, parent=None):
super(CalendarWindow, self).__init__(parent)
self.parent = parent
self.setupUi(self)
self.setWindowTitle('Выберите дату')
self.pushButton_7.clicked.connect(self.change)
def change(self):
data = self.calendar.selectedDate().getDate()
data = list(data)
for i in range(len(data)):
if data[i] < 10:
data[i] = '0' + str(data[i])
data = str(data[2]) + '.' + str(data[1]) + '.' + str(data[0])
self.parent.lable_2.setText('Дата записи: ' + data)
class Ui_Append(object):
def setupUi(self, AppendWindow):
AppendWindow.resize(500, 400)
self.centralwidget = QtWidgets.QWidget(AppendWindow)
self.centralwidget.setObjectName("centralwidget")
self.time = QtWidgets.QTimeEdit(self.centralwidget)
self.time.setGeometry(QtCore.QRect(50, 75, 170, 50))
self.time.setObjectName("timeEditWidget")
font = QtGui.QFont('Times new roman', 16)
font.setBold(True)
self.time.setFont(font)
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.line = QtWidgets.QLineEdit(self.centralwidget)
self.line.setGeometry(QtCore.QRect(280, 75, 170, 50))
self.line.setObjectName("lineEditWidget")
font = QtGui.QFont('Times new roman', 16)
font.setBold(True)
self.line.setFont(font)
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('Введите значение')
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('Новая запись')
if __name__ == '__main__':
app = QApplication(argv)
ex = MyWidget()
ex.show()
exit(app.exec_())
使用固定几何很少是一个好主意。布局管理器,例如
QGridLayout
,确保您的界面始终针对任何窗口分辨率进行优化,考虑到所有小部件用于计算其大小的字体和样式,并确保它们始终正确显示而不会相互重叠。