2

qt列挙値をそのキーに変換することは可能ですか?

たとえば、QPrinter.A4 = 0であることを知って、QPrinterクラスから「A4」を取得したいと思います。

前もって感謝します

4

4 に答える 4

4

通常、次を使用してこれを行うことができますQMetaObject

m = QtGui.QFrame.staticMetaObject
m.enumerator(m.indexOfEnumerator('Shadow')).valueToKey(QtGui.QFrame.Sunken)
'Sunken'

ただしQPrinter、 はメタ オブジェクトを公開していないように見えるためQPrinter、Python で の属性をウォークする必要があります (幸い、PyQt 列挙型は のサブクラスでintあるため、 で識別できますisinstance)。

page_sizes = dict((n, x) for x, n in vars(QtGui.QPrinter).items() if
                  isinstance(n, QtGui.QPrinter.PageSize))
page_sizes[QtGui.QPrinter.A4]
'A4'
于 2012-11-23T18:27:41.393 に答える
3

varsとを使用しisinstanceて、列挙型の双方向マッピングを作成します。

>>> from PyQt4.QtGui import QPrinter
>>> pagesizes = {}
>>> for key, value in vars(QPrinter).iteritems():
...     if isinstance(value, QPrinter.PageSize):
...         pagesizes[key] = value
...         pagesizes[value] = key
... 
>>> pagesizes['A4']
0
>>> pagesizes[QPrinter.A4]
'A4'
>>> pagesizes[0]
'A4'

アップデート:

vars()PyQtのすべてのバージョンで動作するわけではないようですが、動作する可能性がdir()あります。したがって、より堅牢なソリューションは次のようになります。

>>> pagesizes = {}
>>> for key in dir(QPrinter):
...     value = getattr(QPrinter, key)
...     if isinstance(value, QPrinter.PageSize):
...         pagesizes[key] = value
...         pagesizes[value] = key
... 

(注:pyqt-4.10.3 / qt-4.8.5pyqt-4.10/qt-5.1.1およびpyqt-5.1/qt-5.1.1でのみテストされています)

于 2012-11-23T18:39:59.323 に答える
1

ecatmur の回答に基づいて、これを行う関数を実装しました。

def qenum_key(base, value):
    """Convert a Qt Enum value to its key as a string.

    Args:
        base: The object the enum is in, e.g. QFrame.
        value: The value to get.

    Return:
        The key associated with the value as a string, or None.
    """
    klass = value.__class__
    try:
        idx = klass.staticMetaObject.indexOfEnumerator(klass.__name__)
    except AttributeError:
        idx = -1
    if idx != -1:
        return klass.staticMetaObject.enumerator(idx).valueToKey(value)
    else:
        for name, obj in vars(base).items():
            if isinstance(obj, klass) and obj == value:
                return name
        return None

これは最初に QMetaObject を介して値を取得しようとします。それが失敗した場合、またはメタ オブジェクトが存在しない場合は、純粋な Python メソッドにフォールバックします。

于 2014-06-15T09:23:22.463 に答える