2017-03-22 20 views
0

すばらしいです。 QTreeWidgetItemのそれぞれに10個のボタンを含むQWidgetを配置して展開できます。QTreeWidget - 行の内容ごとの行の高さを再計算しますか?

私がQWidgetを非表示にすると、その行は同じ高さのままです。表示されていないボタンだけを含むためには、サイズをもっと小さくする必要があります。行が占めるスペースは空のままです。新しいウィジェットを追加したときのみ。行の高さが再計算されます。同じことが拡大のために行く。私がウィジェットを展開すると、まだ17ピクセルの高さです。新しいウィジェットを追加した場合にのみ、行の高さが再計算されます。コンテンツ、または私は各項目をループする必要がありますし、手動でその高さを調整 -

は、私はその行の高さを更新するために呼び出すことができQTreeWidgetの組み込み機能はありますか?

また、QTreeWidgetItem内にレイアウトとたくさんのウィジェットを含むQWidgetを配置することをお勧めしますか?私は500のQtreeWidgetItemsを言うことができたら、それぞれに20個のButtons/etcアイテムを持つQTreeWidgetを持っていますか?

よろしく ダリウス

EDIT1。

私はかなりの時間を費やしています。異なる道を試しましたが、これまでの運はありません。問題を示すために私の大雑把なコードを付けました。 1〜2回隠すだけで、何が起こるかご覧いただけます。私は "sizeHint"シンジがどのように機能するのか理解するのに苦労しています...

以下のテストを添付しました。

import sys 
from PyQt5.QtGui import * 
from PyQt5.QtCore import * 
from PyQt5.QtWidgets import * 

sys._excepthook = sys.excepthook 


def my_exception_hook(exctype, value, traceback): 
    # print(exctype, value, traceback) 
    sys._excepthook(exctype, value, traceback) 
    sys.exit(1) 


sys.excepthook = my_exception_hook 


class myWidget(QWidget): 
    def __init__(self, parent, something): 
     super(QWidget, self).__init__() 
     self.MW = parent 
     self.MWa = something 
     self.lay_main = QGridLayout() 
     self.setLayout(self.lay_main) 

     self.le_lineA = QLineEdit() 
     self.btn_a = QPushButton("Hey") 
     self.btn_a.clicked.connect(self.hideunhide) 
     self.subWidget = QWidget() 
     self.subLay = QGridLayout() 
     self.subWidget.setLayout(self.subLay) 

     self.btn_b = QPushButton("Boo") 
     self.lay_main.addWidget(self.btn_a) 
     self.lay_main.addWidget(self.subWidget) 
     self.subLay.addWidget(self.le_lineA) 
     self.subLay.addWidget(self.btn_b) 
     print("Im created :-)") 
     self.size = False 

    def hideunhide(self): 
     if self.subWidget.isHidden(): 
      self.subWidget.show() 
      self.size = True 
      self.MW.sizeHint(1) 
      self.MW.setSizeHint(0, QSize(0, 0)) 

     else: 
      self.subWidget.hide() 
      self.size = False 
      self.MW.sizeHint(1) 
      self.MW.setSizeHint(0, QSize(0, 0)) 


class widgetItemDictUpdate(QTreeWidgetItem): 
    def __init__(self, parent, MW, title, dicId): 
     super(QTreeWidgetItem, self).__init__(parent) 
     self.MW = MW 
     self.dicId = dicId 


class myDelegate(QItemDelegate): 
    def __init__(self, mw): 
     self.MW = mw 
     super(QItemDelegate, self).__init__() 

    def sizeHint(self, option, index): 
     print("myDelegate", option, index) 
     if self.MW.itemFromIndex(index).layer.size: 
      return QSize(100, 100) 
     return QSize(100, 30) 


class treeWidget(QTreeWidget): 
    def __init__(self, MW): 
     QTreeWidget.__init__(self) 
     self.setUniformRowHeights(False) 
     self.MW = MW 
     self.itemClicked.connect(self.printClick) 
     self.setHeaderItem(QTreeWidgetItem(["Name", "ProgressBar", "extra", "", "", "", "", "", "", "", ""])) 
     self.setDragDropMode(QAbstractItemView.InternalMove) 
     self.setSelectionMode(QAbstractItemView.ExtendedSelection) 
     self.dragItems = [] 

     self.lastHidenItemsArray = [] 
     self.hiddenItemsSet = [] 

     self.delg = myDelegate(self) 
     self.setItemDelegate(self.delg) 
     self.addItems(self.invisibleRootItem()) 

    def printClick(self, item, column): 
     print("Clicked") 

    def addItems(self, parent): 
     testParent = self.addSlave(parent, 'RandomA', 50) 
     testParent = self.addSlave(parent, 'RandomB', 60) 
     testParent = self.addSlave(parent, 'RandomBX', 60) 
     testParent = self.addSlave(parent, 'RandomBcvas', 60) 

    def addSlave(self, parent, title, id, expanded=True, visible=True): 
     item = widgetItemDictUpdate(parent, self, title, id) 
     myLayer = myWidget(item, self) 
     item.setText(0, title) 
     item.layer = myLayer 
     self.setItemWidget(item, 1, myLayer) 
     item.id = id 
     item.type = 1 

     return item 


class Window(QWidget): 
    def __init__(self): 
     QWidget.__init__(self) 
     self.treeWidget = treeWidget(self) 
     layout = QVBoxLayout() 
     layout.addWidget(self.treeWidget) 
     self.setLayout(layout) 
     self.setGeometry(1000, 500, 500, 500) 


if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    window = Window() 
    window.show() 
    sys.exit(app.exec_()) 
+0

ちょっと@Dariusz。 QTableWidgets/QTableViewsには、QTableWidget :: setRowHeight(int index、int height)関数を使用して変更できる動的行高さが組み込まれていることが分かりました。あなたはQTreeWidgetを使用してロックされていますか、代わりにQTableWidgetを使用できますか? – aatwo

+0

ちょっと@aatwo。この問題について再度作業を開始しました。 QTableWidgetsが動作するかどうかわからない場合は、QTreeWidgetのように行を上/下/グループに移動できますか?私はいくつかの基本的なテストを試みたが、これまでの運は – Dariusz

+0

それはあなたのデータの構造によって異なります。 QTreeViewsの機能のツリー部分を実際に使用している場合、つまり、1つ以上の行が別の行の子である場合、残念ながら、あなたはかなりロックされています。行の高さに対する優れたコントロールを指摘したかっただけです!あなたは間違いなく列を上下に動かすことができます。 – aatwo

答えて

0

は、私の知る限り、あなたが(PyQt: How Can I set row heights of QTreeView

代わりに私が想像QTreeView + QSortFilterProxyModelサブクラスペアとしてあなたのテーブルを実装することで、動的な行の高さを実現することができますが、直接の行のサイズを変更する方法はありませんテーブル(removeItemWidget)からウィジェットを削除してすぐに再追加すると、行のサイズが再計算されますが、テストしていません。テーブル内のレイアウトのこの設定に関する私の意見としては、それは二つのことは注目に値する

  • Qtのレイアウトが移入してサイズを変更するのが遅いです。
  • 可変の行の高さを持つQtテーブルは、一般的に遅いです。

500は、膨大な数ではありません言われていること。私は、おそらく高速プロトタイプをノックして、パフォーマンスが許容できるかどうかを確認し、それが遅すぎる場合は他のルートを探索することを心配するために、さまざまなマシンでどのように動作するかを確認します。この場合のパフォーマンスは、レイアウトの複雑さに最も依存することが予想されます。

+0

ちょっと@aatwo removeItemWidgetで提案してくれてありがとう、私はそれについて気にしていますatm。問題を解決するための私の現在の試みのサンプルコードを追加しました。新しい根拠。 – Dariusz

関連する問題