检测QLineEdit或QPushButton上的输入

时间:2013-03-22 02:16:44

标签: qt python-3.x pyqt keypress qlineedit

我为游戏构建了一个应用程序,开始很简单。这是一个系统随机选择一个数字并且游戏者(玩家)试图找出数字的游戏。一切都快完成了。该应用程序包含QLineEdit,标签和三个按钮。一旦应用告诉玩家所需号码的范围,他/她就会输入 bet_number 并点击播放按钮。根据这个号码,他/她会收到一条消息,说明所需号码离 bet_number 的距离有多近。

但我觉得单击按钮有点恶心。相反,我想使用 Enter键进行播放。所以要实现这一点,具体来说有两个问题:

  1. 如何改变使用Enter进行播放(我的意思是我需要知道QLineEdit检测到输入键是否被按下)?通过这种方式,我将正确编码以指出播放方法。

  2. 如果播放按钮有焦点,那么如何在此按钮上使用回车键? (make Button接受Enter键)

3 个答案:

答案 0 :(得分:39)

对于QLineEdit连接到returnPressed信号,如果您在setAutoDefault上使用QPushButton方法,则在clicked信号>在焦点QPushButton上按

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import sip
sip.setapi('QString', 2)
sip.setapi('QVariant', 2)

from PyQt4 import QtGui, QtCore

class MyWindow(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)

        self.pushButtonOK = QtGui.QPushButton(self)
        self.pushButtonOK.setText("OK")
        self.pushButtonOK.clicked.connect(self.on_pushButtonOK_clicked)
        self.pushButtonOK.setAutoDefault(True)

        self.lineEditNumber = QtGui.QLineEdit(self)
        self.lineEditNumber.returnPressed.connect(self.pushButtonOK.click)

        self.layoutHorizontal = QtGui.QHBoxLayout(self)
        self.layoutHorizontal.addWidget(self.pushButtonOK)
        self.layoutHorizontal.addWidget(self.lineEditNumber)

    @QtCore.pyqtSlot()
    def on_pushButtonOK_clicked(self):
        inputNumber = self.lineEditNumber.text()
        if inputNumber.isdigit():
            info = "You selected `{0}`"

        else:
            info = "Please select a number, `{0}` isn't valid!"

        print info.format(inputNumber)

if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('MyWindow')

    main = MyWindow()
    main.show()

    sys.exit(app.exec_())

答案 1 :(得分:11)

每当用户在其中按下回车键时,

QLineEdit将发出信号returnPressed()http://qt-project.org/doc/qt-4.8/qlineedit.html#signals。您可以将此信号连接到按钮的click()插槽,也可以直接拨打按钮的clicked()信号所连接的任何信号。

答案 2 :(得分:0)

其他答案的 C++ 略有变化,它没有显着不同,但我想我还是会包括它,因为你在 QT 代码中放置东西的方式可能会因代码库而异,我想去掉无关的东西给出最短且最容易理解的代码摘录。

  QLineEdit *TextSend = new QLineEdit("");
  QPushButton *SendPB = new QPushButton("Send!");
  
  connect(TextSend, &QLineEdit::returnPressed, this, &CLITab::SendCommand);
  connect(SendPB, &QPushButton::released, this, &CLITab::SendCommand);

所以我们要做的是创建一个 QLineEdit 文本框和一个 QPushbutton。

我们做一些装饰性的事情,比如为它们设置字符串标签并将它们添加到我们的布局中。

然后我们设置一个回调处理程序,当QLineEdit返回“returnPressed”时会触发它,然后它会自动调用到我写的一个名为“CLITab::SendCommand()”的函数中,然后由这个函数来提取从 QLineEdit 中取出数据并做任何需要做的事情。实际上,TextSend 和 SendPB 指针将位于父类中,因此 SendCommand() 可以查看这些对象。

把它放在这里,旁边是一个按钮示例,因为本质上它们的工作方式完全相同,唯一不同的是发出的信号名称。