PySide和PySide2之间的QKeySequence区别
Posted
技术标签:
【中文标题】PySide和PySide2之间的QKeySequence区别【英文标题】:QKeySequence differences between PySide and PySide2 【发布时间】:2018-12-08 21:44:10 【问题描述】:由于我目前正在将 gui 应用程序从 Python 2.7.14/PySide 1.2.4 移植到 Python 3.7.1/PySide2 5.11.2,因此我在使用快捷方式机制时遇到了一些问题。更具体地说:
与 PySide 相比,QKeySequence
实例化似乎在 PySide2 中返回不同/令人惊讶的结果。
Qt.Key_*
枚举上的 +
运算符似乎没有返回预期的结果。例如,QKeySequence(Qt.SHIFT + Qt.CTRL + Qt.Key_Z)
似乎无法正常工作。
当使用字符串代码来实例化QKeySequences
时,它可以工作,例如QKeySequence("Shift+Ctrl+Z")
似乎可以正常工作。
QKeySequence.StandardKey
的实例化(如 QKeySequence(QKeySequence.Redo)
)只会在 PySide2 中崩溃。
这些是已知的错误吗?预期用途有什么变化吗?我错过了something in the docs吗?
Win7x64/Python 3.7.1/PySide2 5.11.2 (功能失调/崩溃)
# -*- coding: utf-8 -*-
"""Test QKeySequence equality/matching in PySide2."""
from PySide2.QtCore import Qt
from PySide2.QtGui import QKeySequence
sequence_a = QKeySequence("Shift+Ctrl+Z")
sequence_b = QKeySequence(Qt.SHIFT + Qt.CTRL + Qt.Key_Z)
# string representation
print(sequence_a.toString())
print(sequence_b.toString())
print("-"*20)
# equality/matching
print(sequence_a.matches(sequence_b))
print(sequence_a == sequence_b)
print("-"*20)
# this causes a crash in PySide2 (Process finished with exit code -1073741819 (0xC0000005))
print(QKeySequence(QKeySequence.Redo))
# Ctrl+Shift+Z
# [
# --------------------
# PySide2.QtGui.QKeySequence.SequenceMatch.NoMatch
# False
# --------------------
# Process finished with exit code -1073741819 (0xC0000005)
Win7x64/Python 2.7.14/PySide 1.2.4 (工作)
# -*- coding: utf-8 -*-
"""Test QKeySequence equality/matching in PySide."""
from PySide.QtCore import Qt
from PySide.QtGui import QKeySequence
sequence_a = QKeySequence("Shift+Ctrl+Z")
sequence_b = QKeySequence(Qt.SHIFT + Qt.CTRL + Qt.Key_Z)
# string representation
print(sequence_a.toString())
print(sequence_b.toString())
print("-"*20)
# equality/matching
print(sequence_a.matches(sequence_b))
print(sequence_a == sequence_b)
print("-"*20)
# this works in PySide
print(QKeySequence(QKeySequence.Redo))
# Ctrl+Shift+Z
# Ctrl+Shift+Z
# --------------------
# PySide.QtGui.QKeySequence.SequenceMatch.ExactMatch
# True
# --------------------
# PySide.QtGui.QKeySequence(67108953, 0, 0, 0)
【问题讨论】:
在 Linux 上的 PySide 1.2.4 中,我在两个版本中都得到了相同的行为。运行时会得到什么:import PySide print(PySide.__version__)
?
Python3: $ python -c "import PySide2; print(PySide2.__version__)" 5.11.2
Python2: $ python -c "import PySide; print PySide.__version__" 1.2.4
.顺便提一句。在 Windows7x64 上运行。
PySide + Python2:Ctrl+Shift+Z Ctrl+Shift+Z -------------------- PySide.QtGui.QKeySequence.SequenceMatch.ExactMatch True -------------------- Segmentation fault (core dumped)
PySide + Python3:Ctrl+Shift+Z [ -------------------- PySide.QtGui.QKeySequence.SequenceMatch.NoMatch False -------------------- Segmentation fault (core dumped)
另一种选择:Qt.ShiftModifier | Qt.ControlModifier | Qt.Key_Z)
【参考方案1】:
目前,出现了两种可能的解决方法:
错误:
QKeySequence(Qt.SHIFT + Qt.CTRL + Qt.Key_Z).toString()
--> "["
使用强制优先级修复: QKeySequence(Qt.SHIFT + (Qt.CTRL + Qt.Key_Z)).toString()
--> "Ctrl+Shift+Z"
用位或运算符修复: QKeySequence(Qt.ShiftModifier | Qt.CTRL | Qt.Key_Z).toString()
--> "Ctrl+Shift+Z"
虽然它们似乎解决了手头的直接问题,但由于各种原因,我发现它们并不是那么好。一般问题仍然可能符合 PySide2 错误!?
【讨论】:
枚举通常只能使用|
组合 - 使用 +
是您这边的使用错误。但是,使用QKeySequence.Redo
时的崩溃绝对是一个错误,应该报告恕我直言
@Felix 像这样的+
运算符的用法在docs 和few times 中作为示例给出。所以我不会把它算作一个经典的使用错误。事实上,它甚至似乎是首选用法。以上是关于PySide和PySide2之间的QKeySequence区别的主要内容,如果未能解决你的问题,请参考以下文章
PySide2 和支持 addToJavaScriptWindowObject
Pyside2.QtCore.QObject 不是 MyTableWidget 的直接基类——PySide2 出错