У меня 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__':
Если вы хотите центрировать окно, вы должны сделать это, когда оно видно, в этом случае должен использоваться сигнал 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())
)
@eyllansec ВЫ на ТАК САМЫЙ ЛУЧШИЙ!
Это сводило меня с ума на несколько недель!