Центр по размеру страницы Qwizard
У меня есть Qwizard
с 2 страницами.
Когда мастер открыт, он центрируется по центру экрана.
Первая страница меньше второй страницы.
Когда нажимается следующая кнопка и отображается вторая страница, она добавляет дополнительные элементы внизу первой страницы, но не перецентрирует страницу.
На меньших экранах это означает, что кнопки находятся за пределами экрана внизу и не видны, пока пользователь не переместит окно вверх.
Я пытался использовать стандартное центрирование виджетов QT, но Qwizard
похоже не отвечает на это.
Как я могу центрировать вторую страницу мастера, чтобы отображался весь виджет?
import sys
from PyQt5.QtCore import Qt, QPoint, QIODevice, QDateTime, QSize, QObject, QProcess, pyqtSignal, QThread, QEvent, QTimer, QBasicTimer
from PyQt5.QtWidgets import QStyle, QWidget, QMainWindow, QCompleter, QProgressBar, QFileDialog, QApplication, qApp, QLineEdit, QLabel, QComboBox, QWizard, QWizardPage, QPushButton, QVBoxLayout, QShortcut, QMessageBox, QDesktopWidget, QHBoxLayout
from PyQt5.QtGui import QPainter, QFont, QIcon, QPixmap, QPalette, QLinearGradient, QColor, QBrush, QCursor
class Wizard(QWizard):
# Initilisation of the UI and Wizard
def __init__(self, parent=None):
super(Wizard, self).__init__(parent)
self.addPage(EnterToken(self))
self.addPage(EnterCode(self))
class EnterToken(QWizardPage):
def __init__(self, parent=None):
super(EnterToken, self).__init__(parent)
# Spacer blank label
self.spacer = QLabel()
# Enter Token Widgets
self.label1 = QLabel()
self.enter_token_box = QLineEdit()
# empty text box for button
self.empty = QLineEdit()
self.btn = QPushButton('Enter Token')
# layout options
layout = QVBoxLayout()
layout.addWidget(self.spacer)
layout.addWidget(self.label1)
layout.addWidget(self.enter_token_box)
layout.addWidget(self.btn)
self.setLayout(layout)
def _EnterToken(self):
""" Method for processing user input after the button is pressed"""
text = self.enter_token_box.text()
class EnterCode(QWizardPage):
""" Sensor Code Entry """
def __init__(self, parent=None):
super(EnterCode, self).__init__(parent)
# Spacer Label
self.spacer = QLabel()
self._five_digit = QLineEdit(self)
self.code_combo = QComboBox(self)
self.label1 = QLabel()
self.lineedit1 = QLineEdit(self)
self.lineedit2 =QLineEdit(self)
self.lineedit3 = QLineEdit(self)
self.lineedit4 = QLineEdit(self)
self.lineedit5 = QLineEdit(self)
self.lineedit6 = QLineEdit(self)
self.lineedit7 = QLineEdit(self)
self.lineedit8 = QLineEdit(self)
self.lineedit9 = QLineEdit(self)
self.lineedit10 = QLineEdit(self)
self.code_combo_list = [
'Years', 'Months', 'Weeks', 'Days', 'Hours', 'Years', 'Months', 'Weeks', 'Days', 'Hours']
for x in self.code_combo_list:
self.code_combo.addItem(x)
# num of logs combo box
self.enter_num_logs = QLineEdit(self)
self.num_logs_combo = QComboBox(self)
self.logs_label = QLabel()
self.num_logs_combo_list = [
'Years', 'Months', 'Weeks', 'Days', 'Hours', 'Years', 'Months', 'Weeks', 'Days', 'Hours']
for x in self.num_logs_combo_list:
self.num_logs_combo.addItem(x)
# ~buttons
self.btn = QPushButton('Download Data')
layout = QVBoxLayout()
layout.addWidget(self.spacer)
layout.addWidget(self.label1)
layout.addWidget(self.code_combo)
layout.addWidget(self._five_digit)
layout.addWidget(self.lineedit1)
layout.addWidget(self.lineedit2)
layout.addWidget(self.lineedit3)
layout.addWidget(self.lineedit4)
layout.addWidget(self.lineedit5)
layout.addWidget(self.lineedit6)
layout.addWidget(self.lineedit7)
layout.addWidget(self.lineedit8)
layout.addWidget(self.lineedit9)
layout.addWidget(self.lineedit10)
layout.addWidget(self.logs_label)
layout.addWidget(self.num_logs_combo)
layout.addWidget(self.enter_num_logs)
layout.addWidget(self.btn)
self.setLayout(layout)
if __name__ == '__main__':
1 ответ
Если вы хотите центрировать окно, вы должны сделать это, когда оно видно, в этом случае currentIdChanged
сигнал должен быть использован, но когда вызывается слот, даже новое окно не видно, поэтому мы будем использовать QTimer
обновить его мгновенно позже.
class Wizard(QWizard):
def __init__(self, parent=None):
super(Wizard, self).__init__(parent)
self.addPage(EnterToken(self))
self.addPage(EnterCode(self))
self.currentIdChanged.connect(self.onCurrentIdChanged)
def onCurrentIdChanged(self):
QTimer.singleShot(0, self.center_widget)
def center_widget(self):
self.window().setGeometry(
QStyle.alignedRect(
Qt.LeftToRight,
Qt.AlignCenter,
self.window().size(),
QApplication.desktop().availableGeometry())
)