3

私はPythonだけでなくQtも初めてです。QTableViewテーブルビューのセルにチェックボックスを表示せずに使用したいのですが、デフォルトでそこに表示されるようです。これまでにわかったQt.ItemIsUserCheckableように、フラグを無効にするだけです。しかし、どうすればこれを行うことができますか? 私はフラグを使用しようとしました -この方法で派生モデルクラス内のQAbstractItemModel lの関数:QAbstractTableModel

def flags(self,index):
        return(QtCore.Qt.ItemIsEnabled| QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsSelectable)

Qt.ItemIsUserCheckableだから、私がしたことは、フラグを返さないだけです。これは、たとえばQt.ItemIsEditable、セルを編集可能にするかどうか (セルが返されない場合) の場合は問題なく動作しますが、ItemIsUserCheckableフラグを使用してこれを行うと、チェックボックスには影響しません。私の質問は次のとおりです。Pythonを使用してチェックボックスを削除するにはどうすればよいですか? 助けてください!

4

2 に答える 2

4

まあ、これは自分で解決できると思います。QTableView のチェックボックスの秘密は flag メソッドにはありませんが、代わりに data-method の戻り値にあります。のdata メソッドの説明では、処理したくない場合にQAbstractItemModel無効を返す必要があると説明しています。PyQt4.11 では、 None は無効な QVariant として解釈されるQVariantため、 python のNone値を返さなければならないことを意味します。そのため、役割を処理したくないときにdata メソッドが返されるようにするだけで済みました。None

# works for python 3.4 and PyQt4.11
def data(self,index,role):
    if not index.isValid():
        return(None)
    # for all roles you're not interested in, do nothing: i.e. return python's None which is interpreted as an invalid QVariant value
    elif role != QtCore.Qt.DisplayRole:
        return(None)
    else: 
        return(self.data[index.row()][index.column()])

Noneこのロールはコードにとって重要ではないため、コードが返さQt.CheckStateRoleれ、GUI にチェックボックスが表示されないことに注意してください。ここで、データ メソッドを次のように変更すると、次のようになります。

def data(self,index,role):
    if not index.isValid():
        return(None)
    elif role == QtCore.Qt.CheckStateRole:
        return("")
    elif role != QtCore.Qt.DisplayRole:
        return(None)
    else: 
        return(self.data[index.row()][index.column()])

もちろん無効ではない文字列 ( "") が返されます。そして -驚き、驚き - チェックボックスが TableView 内に表示されます。もう 1 つのポイントは、上記の flags メソッドを実装しなくても、これらすべてが機能することです。Qt.CheckStateRoleQVariant

于 2015-04-15T21:19:47.947 に答える