【发布时间】:2019-12-06 19:24:17
【问题描述】:
我正在开发QWizardPage,用户可以在其中搜索要安装的软件包。因此我提供了一个搜索按钮(QPushButton)和一个QLineEdit(作为搜索按钮的buddy())。
我的问题是,向导的下一步按钮一直都有焦点。但是对于这个特定页面,我希望 QLineEdit 默认具有焦点,而 return 或 enter 会触发搜索按钮。
我已经在QLineEdit 上尝试过setDefault(True) 和setFocus(),但这不起作用。我通读了文档,但找不到在 PyQt5 中访问QWizardPage 的下一个按钮的方法。我想也许有类似autofocus(False) 的东西可以在特定的向导页面上禁用它。
如何将焦点设置在QWizardPage 内的QLineEdit 上并让return 或enter 触发自定义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_())
【问题讨论】:
-
@Joey 据我了解,您希望“搜索”按钮成为接收“输入”或“返回”的按钮。我说的对吗?
-
@eyllanesc 没错。
标签: python python-3.x pyqt pyqt5 qwizardpage