按下鼠标的PyQt连接

时间:2015-08-31 07:50:11

标签: python qt signals-slots

我使用Qt Creator在我的Python2.7脚本中获取GUI。我的经验是5天,我从未使用过Qt本身。

所有小部件的主窗口看起来都很棒。有很多 lineEdit 小部件,小部件内的文本会不断刷新(200毫秒)。我现在的任务是实现这样的行为:

1)我将鼠标移动到 editLine 并单击

2)此小部件的刷新停止

3)我编辑文本(或写一个全新的文本)并按Enter键

4)新文本传递到某个地方进行处理

5)刷新简历

AFAIK,步骤2和3可以用信号槽方法实现。并完成了第3步。但我无法连接鼠标按键事件。 Qt editLine 小部件中没有此类信号。

我搜索了答案。 Print while mouse pressed已关闭,但我不确定是否应将事件技术与 signal-slot 一起使用。而且我当然不知道如何实现这个" DetectMouseClick()" ......

以下是专门用来说明我案例的2个文件。

1-st是一个主要模块:

- (void)viewDidLoad {
    [super viewDidLoad];      

   _txtFirstName = [[CustomTextField alloc]init];
    _txtLastName = [[CustomTextField alloc]init];
    _txtEmail = [[CustomTextField alloc]init];
    _txtPassword = [[CustomTextField alloc]init];


}

2-nd是生成的Qt文件,其中添加了:

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

import sys
import PyQt4.QtCore
from PyQt4 import QtCore, QtGui
from mw import Ui_MW
import time


class Main(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        # This is always the same
        self.ui = Ui_MW()
        self.ui.setupUi(self)
        self.refresh = PyQt4.QtCore.QTimer()
        self.update_data()

    def update_data(self):
        t = time.time()
        t %= 1000
#        self.ui.lineEdit.setText('{:5.1f}'.format(t))
# as long as the line is commented, all runs ok
        self.refresh.singleShot(200, self.update_data)


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = Main()
    window.show()
    sys.exit(app.exec_())

2 个答案:

答案 0 :(得分:0)

QApplication对象上有一个focusChanged信号。对于大多数用途来说,它比观看点击更好,因为键盘焦点可能会在窗口小部件中以多种方式结束(例如,点击标签)。 http://doc.qt.io/qt-4.8/qapplication.html#focusChanged。由于focusChanged由应用程序对象发出以进行任何焦点更改,因此您可能希望将插槽放在窗口(Main)对象上,然后在focusChanged的参数与其匹配时调用窗口小部件。

答案 1 :(得分:0)

您可以创建自己的类,扩展QLineEdit并重新实现方法mousePressEvent

class myLineEdit(QtGui.QLineEdit):
    def __init__(self, parent=None):
        super(myLineEdit, self).__init__(parent)

    def mousePressEvent(self, event):
        super(myLineEdit, self).mousePressEvent(event)
        if event.button() == QtCore.Qt.LeftButton:
            self.emit(QtCore.SIGNAL("mousePressed()"))

不要忘记更改setupUi中的班级名称:

    self.lineEdit = myLineEdit(self.centralwidget)

在主文件中(在__init__中)创建连接:

    QtCore.QObject.connect(self.ui.lineEdit, QtCore.SIGNAL("mousePressed()"), self.stop_refreshing)
    QtCore.QObject.connect(self.ui.lineEdit, QtCore.SIGNAL("returnPressed()"), self.resume_refreshing)

并在Main.__init__开头添加:

self.timer_stopped = False 

我还建议在update_data做一点改动并创建我们的两个新插槽:

def update_data(self):
    t = time.time()
    t %= 1000
    self.ui.lineEdit.setText('{:5.1f}'.format(t))
    # as long as the line is commented, all runs ok
    if not self.timer_stopped:
        self.refresh.singleShot(200, self.update_data)
    else:
        self.ui.lineEdit.setText("")

def stop_refreshing(self):
    self.timer_stopped = True
    print("Refreshing stopped")

def resume_refreshing(self):
    self.timer_stopped = False
    print("Refreshing resumed")
    self.update_data()