1

我正在开发一个QWizardPage用户可以搜索要安装的包的地方。因此我提供了一个搜索按钮 (a QPushButton) 和 a QLineEdit(作为搜索按钮的buddy())。

我的问题是,向导的下一个按钮一直都有焦点。但是对于这个特定的页面,我希望QLineEdit默认情况下具有焦点,return或者enter触发搜索按钮。

我已经尝试过,setDefault(True)但那不起作用。我通读了文档,但找不到在 PyQt5 中访问“下一步”按钮的方法。我想也许有类似的东西可以在特定的向导页面上禁用它。setFocus()QLineEditQWizardPageautofocus(False)

如何将焦点设置在QLineEdit内部QWizardPage并让returnenter触发自定义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_())

4

1 回答 1

2

您必须在显示按钮后立即更改按钮的默认属性,在这种情况下,您可以使用QWizardPage的initializePage()方法:

# ...
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))
# ...
于 2019-07-29T13:29:30.317 回答