4

このスレッドのおかげで、のトップレベルアイテムのQAbstractItemView(私の例ではQTreeViewの) 2番目以降の列にウィジェットを追加することができますview

しかし、子アイテムにウィジェットを追加することは可能ですか?

これが私が試したもので、部分的にうまくいきました:

#!/usr/bin/env python
import os

from PyQt4.QtCore import QModelIndex, Qt
from PyQt4.QtGui import QApplication, QItemSelectionModel, \
                        QPushButton, QStandardItem, \
                        QStandardItemModel, QTreeView
from PyQt4.uic import loadUi


class PrvTreeviewNest(QTreeView):
    def __init__(self):
        super(PrvTreeviewNest, self).__init__()

        loadUi('/home/user/yourproject/resource/treeview_nest.ui')

        # row can be 0 even when it's more than 0.
        self._datamodel = QStandardItemModel(0, 2)
        self.setModel(self._datamodel)

        for i in range(4):
            self._add_widget(i + 1)

        self.show()

    def _add_widget(self, n):
        std_item = QStandardItem('{}th item'.format(n))
        self._datamodel.setItem(n, 0, std_item)

        node_widget = QPushButton('{}th button'.format(n))
        qindex_widget = self._datamodel.index(n, 1, QModelIndex())
        self.setIndexWidget(qindex_widget, node_widget)

        if n == 2:
            std_item_child = QStandardItem('child')
            std_item.appendRow(std_item_child)

            node_widget_child = QPushButton('petit button')
            qindex_widget_child = self._datamodel.index(n, 1, QModelIndex())
            self.setIndexWidget(qindex_widget_child, node_widget_child)

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    # window = TreeviewWidgetSelectProve()
    window = PrvTreeviewNest()
    # window = TreeviewWidgetSelectProve()
    window.resize(320, 240)
    # window.show();
    window.setWindowTitle(
         QApplication.translate("toplevel", "Top-level widget"))
    # window.add_cols()

    sys.exit(app.exec_())

treeview_nest.uiが利用可能です。

下の画像では、アイテムchildにボタンが表示されておらず、その親のボタンが上書きされていることがわかります。どうやら私はそれのためのコードを書く方法がわかりません。

ここに画像の説明を入力してください


更新)ウィジェットを子に追加する方法を見つけました。トリッキーですが、 QStandardItem.insertRowをインデックスと組み合わせて使用​​すると機能します。上記のサンプルコード_add_widgetで、次のように置き換えます。

    def _add_widget(self, n):
        item_toplevel = QStandardItem('{}th item'.format(n))
        self._datamodel.setItem(n, 0, item_toplevel)

        widget_toplevel = QPushButton('{}th button'.format(n))
        qindex_toplevel = self._datamodel.index(n, 1, QModelIndex())
        self.setIndexWidget(qindex_toplevel, widget_toplevel)

        if n == 2:
            item_child_col0 = QStandardItem('child col0')
            item_child_col1 = QStandardItem('child col1')
            #item_toplevel.appendRow(item_child_col0)

            item_toplevel.insertRow(0, [item_child_col0, item_child_col1])

            widget_child = QPushButton('child widget')
            qindex_child = item_child_col1.index()
            self.setIndexWidget(qindex_child, widget_child)

これは最善/理想的な設計方法ではないと確信していますが、私にとってはうまくいくようです。@Phluciousの答えに触発されて思いついた。ありがとう!

ここに画像の説明を入力してください

4

1 に答える 1

2

あなたの間違いはこの行にあります:

qindex_widget_child = self._datamodel.index(n, 1, QModelIndex())
self.setIndexWidget(qindex_widget_child, node_widget_child)

これは、モデルの行2、列1のインデックスを提供します。これは、子供ではなく、「2番目のアイテム」です。あなたの子供はの行1列1にいstd_itemます。Qt、特にQStandardItemModelでは、子はモデルではなく、親を基準にして格納されます。

私はあなたに正確なコードを与えるのに十分なPyQtに精通していませんが、あなたはこのようなことをすることができるはずです:

qindex_widget_child = std_item_child.index(QModelIndex())
self.setIndexWidget(qindex_widget_child, node_widget_child)

またはこのように:

qindex_widget_child = std_item.child(0, 1).index(QModelIndex())
self.setIndexWidget(qindex_widget_child, node_widget_child)
于 2013-03-08T17:50:32.833 に答える