Python3のGUI:PyQt6とPySide6 2/2

まえがき

1つ目の続き。そのまま翻訳してみた。

Qt6に導入された主な変更点

exec()またはexec_()

この.exec()メソッドは、QApplicationまたはダイアログボックスのイベントループを開始するためにQtで使用される。Python 2.7execではキーワードだった。

つまり、変数、関数、またはメソッドの名前には使用できなかった。PyQt4とPySideの両方で使用された解決策は、この競合を回避するため「.exec」の使用の名前を「exec_()」に変更することだった。

Python 3はexecキーワードを削除し、名前を解放して使用できるようにした。PyQt6の結果として、.exec()呼び出しはQtと同じように名前が付けられます。ただし、PySide6は引き続き「.exec_()」を使用します。

スロットと信号

カスタムスロットとシグナルの定義では、2つのライブラリ間でわずかに異なる構文が使用される。PySide6はこのインターフェイスをSignalとSlotという名前で提供し、PyQt6はこれらをpyqtSignal とpyqtSlotとして提供する。それらの両方の動作は、スロットと信号の定義と同じ。

シグナルの場合:

my_custom_signal = pyqtSignal()  # PyQt6
my_custom_signal = Signal()  # PySide6

my_other_signal = pyqtSignal(int)  # PyQt6
my_other_signal = Signal(int)  # PySide6

スロットの場合:

 @pyqtslot
def my_custom_slot():
    pass

@Slot
def my_custom_slot():
    pass

PyQt6とPySide6の間で一貫性を確保したい場合は、PyQt6の次のインポートパターンを使用してSignal、@Slotそこでもスタイルを使用できる。

from PyQt6.QtCore import pyqtSignal as Signal, pyqtSlot as Slot

QMouseEvent

PyQt6では、QMouseEventオブジェクトには、イベントの位置にアクセスするための.pos()、.x()または.y()省略形のプロパティメソッドがない。.position()プロパティを使用してQPointオブジェクトを取得し、そのオブジェクトの.x()または.y()メソッドにアクセスする必要がある。この.position()メソッドは、PySide6でも使用でる。

PySide6にはあるが、PyQt6にはない機能

Qt 6以降、PySideは2つのPython__feature__フラグをサポートして、変数名と、getter / setter関数を使用するのではなく、プロパティを直接割り当ててアクセスする機能を使用して、コードをよりsnake_case Pythonicにするのに役立つ。以下の例は、これらの変更がコードに与える影響を示している。

table = QTableWidget()
table.setColumnCount(2)

button = QPushButton("Add")
button.setEnabled(False)

layout = QVBoxLayout()
layout.addWidget(table)
layout.addWidget(button)

同じコードですがsnakecase、trueproperty有効になっている。

from __feature__ import snake_case, true_property

table = QTableWidget()
table.column_count = 2

button = QPushButton("Add")
button.enabled = False

layout = QVBoxLayout()
layout.add_widget(table)
layout.add_widget(button)

むすび

気になったのはこれくらい。以上、解散!

参考文献

MARTIN FiTZPATRiCK.: PyQt6 vs PySide6: What’s the difference between the two Python Qt libraries?

コメントする