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和pyside6

如何正确退出 Pyside2 多线程 GUI 应用程序?

PySide2 和支持 addToJavaScriptWindowObject

Pyside2.QtCore.QObject 不是 MyTableWidget 的直接基类——PySide2 出错

使用 PySide2 在 QTableView 中设置文本样式

QOpenGLFunctions 和 PySide2