Error/crash/hang when comparing enum value to uncomparable type
Jean Abou Samra
jean at abou-samra.fr
Sun Oct 23 20:09:01 BST 2022
Hi,
I'm new to Qt and PyQt. I'm trying to unbreak the Frescobaldi application,
which is written in Python with PyQt5. If you want more context, the
upstream issue is
https://github.com/frescobaldi/frescobaldi/issues/1453
This issue appears to be caused by a problem with the QKeySequence
enum, more specifically its behavior when comparing an enum member
with an object of an unrelated type. This works:
>>> from PyQt5.Qt import QKeySequence
>>> QKeySequence.InsertLineSeparator == "string"
False
As expected in Python, two objects of different types without
any special relationship compare unequal. However, take this
script:
import sys
from PyQt5.QtWidgets import QApplication, QPlainTextEdit, QVBoxLayout,
QWidget
from PyQt5.Qt import QKeySequence
class QPlainTextEditSubclass(QPlainTextEdit):
def event(self, ev):
print(QKeySequence.InsertLineSeparator == "string")
class Window(QWidget):
def __init__(self):
super().__init__()
vbox = QVBoxLayout()
plainText = QPlainTextEditSubclass()
plainText.appendPlainText("Hi there")
vbox.addWidget(plainText)
self.setLayout(vbox)
self.show()
App = QApplication(sys.argv)
window = Window()
sys.exit(App.exec())
For me, under Fedora 37 (beta), with both Python 3.10 and Python 3.11,
this doesn't work, which seems strange to me. The comparison is just
embedded in an event handler. In Python 3.11.0rc2, it yields
QSocketNotifier: Can only be used with threads started with QThread
Traceback (most recent call last):
File "/home/jean/repos/frescobaldi/foo.py", line 8, in event
print(QKeySequence.InsertLineSeparator == "string")
TypeError: a member of enum 'StandardKey' is expected not 'str'
Traceback (most recent call last):
File "/home/jean/repos/frescobaldi/foo.py", line 8, in event
print(QKeySequence.InsertLineSeparator == "string")
TypeError: a member of enum 'StandardKey' is expected not 'str'
Then the process seems to freeze indefinitely. It doesn't
respond to signals anymore: instead of "kill <pid>", I have
to use "kill -9 <pid>".
In Python 3.10, I get an immediate crash:
Warning: Ignoring XDG_SESSION_TYPE=wayland on Gnome. Use
QT_QPA_PLATFORM=wayland to run on Wayland anyway.
Traceback (most recent call last):
File "/home/jean/repos/frescobaldi/foo.py", line 8, in event
print(QKeySequence.InsertLineSeparator == "string")
TypeError: a member of enum 'StandardKey' is expected not 'str'
Abandon (core dumped)
Am I right to believe this is a bug in PyQt?
Thanks,
Jean
More information about the PyQt
mailing list