Отключите фокус по умолчанию на следующей кнопке QWizardPage и позвольте вместо пользовательского QPushButton вызывать 'enter'

Я работаю над QWizardPage где пользователь может искать пакеты для установки. Поэтому я предоставил кнопку поиска (QPushButton) и QLineEdit (как кнопка поиска buddy()).

Моя проблема в том, что следующая кнопка мастера постоянно фокусируется. Но для этой конкретной страницы я хочу QLineEdit иметь фокус по умолчанию, и это возврат или ввод вызывает вместо кнопки поиска.

Я уже пробовала setDefault(True) а также setFocus() на QLineEdit, но это не работает. Я прочитал документацию, но не смог найти способ доступа QWizardPageСледующая кнопка в PyQt5. Я думал, может быть, есть что-то вроде autofocus(False) для отключения его на определенной странице мастера.

Как я могу сосредоточиться на QLineEdit внутри QWizardPage и пусть возврат или ввод вызвать пользовательский QPushButton?


Код для воспроизведения:

# -*- coding: utf-8 -*-
from PyQt5.QtGui import QIcon, QStandardItemModel, QStandardItem
from PyQt5.QtCore import Qt, pyqtSignal, pyqtSlot, QObject, QTimer, QThread
from PyQt5.QtWidgets import (QApplication, QProgressBar, QGridLayout, QLabel,
                             QFileDialog, QHBoxLayout, QVBoxLayout, QDialog,
                             QWizard, QWizardPage, QToolButton, QComboBox,
                             QCheckBox, QLineEdit, QGroupBox, QTableView,
                             QAbstractItemView, QFrame, QPushButton)

# ...

#]===========================================================================[#
#] WIZARD [#=================================================================[#
#]===========================================================================[#

class VenvWizard(QWizard):
    """
    Wizard for creating and setting up a virtual environment.
    """
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Venv Wizard")
        self.resize(635, 480)
        self.move(528, 153)

        self.setStyleSheet(
            """
            QToolTip {
                background-color: rgb(47, 52, 63);
                border: rgb(47, 52, 63);
                color: rgb(210, 210, 210);
                padding: 2px;
                opacity: 325
            }

            QTableView {
                gridline-color: rgb(230, 230, 230)
            }

            QTableView::item {
                selection-background-color: rgb(120, 120, 130);
                selection-color: rgb(255, 255, 255)
            }
            """
        )

        self.addPage(InstallPackages())
        self.addPage(Summary())

        # ...


class InstallPackages(QWizardPage):
    """
    Install packages via `pip` into the created virtual environment.
    """
    def __init__(self):
        super().__init__()

        self.setTitle("Install Packages")
        self.setSubTitle(
            "Specify the packages you want to install into the "
            "virtual environment. Right-click on the item to "
            "mark it for installation and click next when ready."
        )

        #]===================================================================[#
        #] PAGE CONTENT [#===================================================[#
        #]===================================================================[#

        verticalLayout = QVBoxLayout()
        gridLayout = QGridLayout(self)

        pkgNameLabel = QLabel("Package name:")
        self.pkgNameLineEdit = QLineEdit()
        pkgNameLabel.setBuddy(self.pkgNameLineEdit)

        self.searchButton = QPushButton(
            "&Search",
            #clicked=self.list_packages
        )

        resultsTable = QTableView(
            selectionBehavior=QAbstractItemView.SelectRows,
            editTriggers=QAbstractItemView.NoEditTriggers,
            alternatingRowColors=True
        )

        # adjust vertical headers
        v_Header = resultsTable.verticalHeader()
        v_Header.setDefaultSectionSize(27.5)
        v_Header.hide()

        # adjust (horizontal) headers
        h_Header = resultsTable.horizontalHeader()
        h_Header.setDefaultAlignment(Qt.AlignLeft)
        h_Header.setDefaultSectionSize(150)
        h_Header.setStretchLastSection(True)

        # set table view model
        self.resultsModel = QStandardItemModel(0, 2, self)
        self.resultsModel.setHorizontalHeaderLabels(
            ["Name", "Version", "Description"]
        )
        resultsTable.setModel(self.resultsModel)

        gridLayout.addWidget(pkgNameLabel, 0, 0, 1, 1)
        gridLayout.addWidget(self.pkgNameLineEdit, 0, 1, 1, 1)
        gridLayout.addWidget(self.searchButton, 0, 2, 1, 1)
        gridLayout.addWidget(resultsTable, 1, 0, 1, 3)

        verticalLayout.addLayout(gridLayout)

        # ...


class Summary(QWizardPage):
    def __init__(self):
        super().__init__()

        self.setTitle("Summary")
        self.setSubTitle("..........................."
                         "...........................")

        #]===================================================================[#
        # TODO: create the summary page
        #]===================================================================[#

    def initializePage(self):
        pass



if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)

    wiz = VenvWizard()
    wiz.show()

    sys.exit(app.exec_())

1 ответ

Решение

Вы должны изменить свойство по умолчанию кнопок через мгновение после их отображения, в этом случае вы можете использовать метод initializePage() класса QWizardPage:

# ...
class InstallPackages(QWizardPage):
    # ...
    def initializePage(self):
        next_button = self.wizard().button(QWizard.NextButton)
        QTimer.singleShot(0, lambda: next_button.setDefault(False))
        QTimer.singleShot(0, lambda: self.searchButton.setDefault(True))
# ...
Другие вопросы по тегам