我使用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_())
答案 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()