在pyqt中如何在按下Ctrl + anyKey时在QLineEdit中打印"Ctrl+key"
in pyqt how to print "Ctrl+key" in QLineEdit when pressed Ctrl + anyKey
在我的代码中,我为 QLineEdit 生成事件以将按下的组合键放在文本行中它可以用于 Shift 键和 Alt 键但不能用于 Ctrl 键为什么?
#!/usr/bin/python
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
def main():
app = QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())
class MyWindow(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
self.la = QLabel("Press tab in this box:")
self.le = MyLineEdit()
layout = QVBoxLayout()
layout.addWidget(self.la)
layout.addWidget(self.le)
self.setLayout(layout)
self.connect(self.le, SIGNAL("press"),
self.update)
def update(self):
oldText = str(self.le.text())
self.le.setText(self.le.myText)
class MyLineEdit(QLineEdit):
def __init__(self, *args):
QLineEdit.__init__(self, *args)
self.myText = ""
def event(self, event):
if event.type() == QEvent.KeyPress:
if event.modifiers() & Qt.ControlModifier :
在文本行中可以使用 Shift 键和 Alt 键我可以在文本行中输入变量 self.myText 值,但不能用于 Ctrl 键,为什么?
print event.text()
self.myText = "Ctrl+"+ event.text()
self.emit(SIGNAL("press"))
return True
return QLineEdit.event(self, event)
if __name__ == "__main__":
main()
当我们使用 key() 方法是可能的,其中 return 键的 int 值,那么我们只需使用 unichr() 函数将 int 转换为 char
class MyLineEdit(QLineEdit):
def __init__(self, *args):
QLineEdit.__init__(self, *args)
def event(self, event):
self.myText = ""
event_key = ""
if event.type() == QEvent.KeyPress:
if event.text() != "" :
event_key = str(unichr(event.key())).lower()
if event.modifiers()== Qt.ControlModifier :
print event.text()
self.myText = "Ctrl+" + event_key
self.emit(SIGNAL("press"))
return True
return QLineEdit.event(self, event)
原始示例不起作用的原因是因为许多 Ctrl+key 组合会产生控制字符 - 例如Ctrl+J 产生一个换行符。
捕获键盘组合的正确方法是使用 QKeySequence, which will work for all keys, including function keys, arrow keys, page up/down keys, etc. You can also get translated shortcuts by using QKeySequence.PortableText。
这是一个基于原始示例的演示:
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
def main():
app = QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())
class MyWindow(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
self.la = QLabel("Press tab in this box:")
self.le = MyLineEdit()
layout = QVBoxLayout()
layout.addWidget(self.la)
layout.addWidget(self.le)
self.setLayout(layout)
self.le.keyPressed.connect(self.update)
def update(self, text):
self.le.setText(text)
MOD_MASK = (Qt.CTRL | Qt.ALT | Qt.SHIFT | Qt.META)
class MyLineEdit(QLineEdit):
keyPressed = pyqtSignal(str)
def keyPressEvent(self, event):
keyname = ''
key = event.key()
modifiers = int(event.modifiers())
if (modifiers and modifiers & MOD_MASK == modifiers and
key > 0 and key != Qt.Key_Shift and key != Qt.Key_Alt and
key != Qt.Key_Control and key != Qt.Key_Meta):
keyname = QKeySequence(modifiers + key).toString()
print('event.text(): %r' % event.text())
print('event.key(): %d, %#x, %s' % (key, key, keyname))
self.keyPressed.emit(keyname)
if __name__ == "__main__":
main()
在我的代码中,我为 QLineEdit 生成事件以将按下的组合键放在文本行中它可以用于 Shift 键和 Alt 键但不能用于 Ctrl 键为什么?
#!/usr/bin/python
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
def main():
app = QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())
class MyWindow(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
self.la = QLabel("Press tab in this box:")
self.le = MyLineEdit()
layout = QVBoxLayout()
layout.addWidget(self.la)
layout.addWidget(self.le)
self.setLayout(layout)
self.connect(self.le, SIGNAL("press"),
self.update)
def update(self):
oldText = str(self.le.text())
self.le.setText(self.le.myText)
class MyLineEdit(QLineEdit):
def __init__(self, *args):
QLineEdit.__init__(self, *args)
self.myText = ""
def event(self, event):
if event.type() == QEvent.KeyPress:
if event.modifiers() & Qt.ControlModifier :
在文本行中可以使用 Shift 键和 Alt 键我可以在文本行中输入变量 self.myText 值,但不能用于 Ctrl 键,为什么?
print event.text()
self.myText = "Ctrl+"+ event.text()
self.emit(SIGNAL("press"))
return True
return QLineEdit.event(self, event)
if __name__ == "__main__":
main()
当我们使用 key() 方法是可能的,其中 return 键的 int 值,那么我们只需使用 unichr() 函数将 int 转换为 char
class MyLineEdit(QLineEdit):
def __init__(self, *args):
QLineEdit.__init__(self, *args)
def event(self, event):
self.myText = ""
event_key = ""
if event.type() == QEvent.KeyPress:
if event.text() != "" :
event_key = str(unichr(event.key())).lower()
if event.modifiers()== Qt.ControlModifier :
print event.text()
self.myText = "Ctrl+" + event_key
self.emit(SIGNAL("press"))
return True
return QLineEdit.event(self, event)
原始示例不起作用的原因是因为许多 Ctrl+key 组合会产生控制字符 - 例如Ctrl+J 产生一个换行符。
捕获键盘组合的正确方法是使用 QKeySequence, which will work for all keys, including function keys, arrow keys, page up/down keys, etc. You can also get translated shortcuts by using QKeySequence.PortableText。
这是一个基于原始示例的演示:
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
def main():
app = QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())
class MyWindow(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
self.la = QLabel("Press tab in this box:")
self.le = MyLineEdit()
layout = QVBoxLayout()
layout.addWidget(self.la)
layout.addWidget(self.le)
self.setLayout(layout)
self.le.keyPressed.connect(self.update)
def update(self, text):
self.le.setText(text)
MOD_MASK = (Qt.CTRL | Qt.ALT | Qt.SHIFT | Qt.META)
class MyLineEdit(QLineEdit):
keyPressed = pyqtSignal(str)
def keyPressEvent(self, event):
keyname = ''
key = event.key()
modifiers = int(event.modifiers())
if (modifiers and modifiers & MOD_MASK == modifiers and
key > 0 and key != Qt.Key_Shift and key != Qt.Key_Alt and
key != Qt.Key_Control and key != Qt.Key_Meta):
keyname = QKeySequence(modifiers + key).toString()
print('event.text(): %r' % event.text())
print('event.key(): %d, %#x, %s' % (key, key, keyname))
self.keyPressed.emit(keyname)
if __name__ == "__main__":
main()