代码之家  ›  专栏  ›  技术社区  ›  johnashu

禁用“下一步”按钮的Enterkey Pyqt5 Qwizard

  •  1
  • johnashu  · 技术社区  · 8 年前

    我在做一个巫师 QWizard

    我有 QLineEdit QPushButton

    # 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 从被链接到 下一个 按钮。

    如何访问和重写 BACK ,请 NEXT FINISH 按钮 向导 是吗?

    1 回复  |  直到 8 年前
        1
  •  2
  •   eyllanesc    8 年前

    要访问按钮,必须使用 button() 方法并通过 QWizard::WizardButton ,在您的情况下,必须禁用 default QpushButton的。

    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)