47

我已经为游戏构建了一个应用程序,上手简单。这是一个游戏,系统随机选择一个数字,游戏玩家(玩家)试图找出这个数字。一切都快完成了。该应用程序由一个QLineEdit、一个标签和三个按钮组成。一旦应用程序告诉玩家想要的号码范围,他/她就会输入一个bet_number并点击播放按钮。根据这个号码,他/她会收到一条消息,说明想要的号码离bet_number有多近或多远。

但是我觉得点击一个按钮有点恶心。相反,我想使用Enter 键来播放。因此,要实现这一点,它具体归结为两个问题:

  1. 如何改变使用 Enter 播放(我的意思是我需要知道何时QLineEdit检测到 Enter 键被按下)?这样,我将正确编码以指向播放方法。

  2. 如果播放按钮获得焦点,你如何在这个按钮上使用回车键?(使 Button 接受 Enter 键)

4

3 回答 3

62

用于QLineEdit连接returnPressed信号。

或者,如果您在ssetAutoDefault上使用该方法,则在按下焦点时发出信号:QPushButtonclickedEnterQPushButton

#!/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_())
于 2013-03-22T10:16:41.150 回答
19

QLineEditreturnPressed()只要用户在其中按下回车键,就会发出信号:http: //qt-project.org/doc/qt-4.8/qlineedit.html#signals。您可以将此信号连接到按钮的click()插槽,也可以直接调用clicked()连接到按钮的任何信号。

于 2013-03-22T10:15:43.960 回答
2

其他答案的轻微 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() 对这些对象具有可见性。

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

于 2021-06-02T20:50:27.070 回答