【问题标题】:Disable enterkey for next button pyqt5 QWizard禁用下一个按钮的输入键pyqt5 QWizard
【发布时间】:2018-12-09 22:31:11
【问题描述】:

我正在 QWizard 中制作向导

我有QLineEditQPushButton

# Enter token
self.enter_token_box = QLineEdit()
# Enter token button
self.btn = QPushButton('OK')
# connect button to function, checks the token..
self.btn.clicked.connect(self._EnterToken)

我已经输入了接受回车键并运行与单击“确定”按钮相同的功能的行。

# Enter key press connection
self.enter_token_box.returnPressed.connect(self._EnterToken)

问题在于它会同时触发向导的OK 按钮和Next 按钮。

MVCE:

import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *


class Wizard(QWizard):
    def __init__(self, parent=None):
        super(Wizard, self).__init__(parent)

        self.addPage(EnterToken(self)) 
        self.addPage(ProcessData(self))

class EnterToken(QWizardPage):
    def __init__(self, parent=None):
        super(EnterToken, self).__init__(parent)

        self.setTitle("Enter your token here")
        self.setSubTitle(" ")           

        # Enter Token Widgets
        self.label = QLabel()
        self.enter_token_box = QLineEdit()        

        self.btn = QPushButton('OK')

        # layout options
        layout = QVBoxLayout()
        layout.addWidget(self.label)        
        self.label.setText("Enter Your 12 Digit Code.")
        layout.addWidget(self.enter_token_box)
        layout.addWidget(self.btn)

        # Enter Key TRigger
        self.enter_token_box.returnPressed.connect(self._EnterToken)

        self.btn.clicked.connect(self._EnterToken)

        self.setLayout(layout)        


    def _EnterToken(self):
        """ Method for processing user input after the button is pressed"""

        QMessageBox.about(self, "I want only this!!", "I want only you and not the next page!!")


class ProcessData(QWizardPage):
    """ Sensor Code Entry """
    def __init__(self, parent=None):
        super(ProcessData, self).__init__(parent)        

        # num of logs combo box
        self.num_logs_combo = QComboBox(self)

        # ~buttons
        self.btn = QPushButton('OK')

        layout = QVBoxLayout()
        layout.addWidget(self.num_logs_combo)
        layout.addWidget(self.btn)  
        self.setLayout(layout)    

if __name__ == '__main__':
    app = QApplication(sys.argv)
    wizard = Wizard()
    wizard.show()
    sys.exit(app.exec_())

如果您运行上面的代码并单击ok,您将留在页面上。如果您选择了除 QLineEdit 框之外的任何其他内容,也会发生同样的情况。

如果您在QLineEdit 框中并按下Enter,您将被带到下一页并显示消息框。

如何阻止Enter Key 链接到Next 按钮。

如何访问和覆盖QWizardBACKNEXTFINISH 按钮的属性?

【问题讨论】:

标签: python pyqt pyqt5 qpushbutton qwizard


【解决方案1】:

要访问按钮,您必须使用button() 方法并传递QWizard::WizardButton,在您的情况下,您必须禁用QPushButton 的default

class Wizard(QWizard):
    def __init__(self, parent=None):
        super(Wizard, self).__init__(parent)

        self.addPage(EnterToken(self)) 
        self.addPage(ProcessData(self))

    def showEvent(self, event):
        self.button(QWizard.NextButton).setDefault(False)
        super(Wizard, self).showEvent(event)

更新:

class Wizard(QWizard):
    def __init__(self, parent=None):
        super(Wizard, self).__init__(parent)

        self.addPage(EnterToken(self)) 
        self.addPage(ProcessData(self))

        self.buttons = [self.button(t) for t in (QWizard.NextButton, QWizard.FinishButton)]

        for btn in self.buttons:
            btn.installEventFilter(self)

    def eventFilter(self, obj, event):
        if obj in self.buttons and event.type() == QEvent.Show:
            obj.setDefault(False)
        return super(Wizard, self).eventFilter(obj, event)

【讨论】:

  • 我之前尝试过setAutoDefaultsetDefault,但它在页面类中!! setDefaultWizard 类中完美运行。!
  • @johnashu 你是对的,两个都试一下,复制的时候把不正确的删掉。
  • 效果很好..我如何覆盖完成按钮?
  • 我的意思是我添加了相同的功能,自动和不自动,并将 NextButton 更改为 FinishButton,它仍然突出显示完成按钮..
  • 非常优雅!.. 这很完美,并且使用 python 方法更有意义! :)
猜你喜欢
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多