14

私はQtに比較的慣れておらず、すぐに使用できるウィジェットに完全に精通しているわけではありません。作成するウィジェットはやや(それほどではありませんが)複雑で、ホイールを作り直したくありません。サブクラスの開始点として使用するのに最適なQWidgetや、ウィジェットの作成に使用するQWidgetsは何ですか。これが私が探している最終結果です(原油図面の謝罪):

ウィジェット

キーポイント:

  • すべてのアイコンは同じサイズ、たとえば128 x 128になります。カテゴリのグループ化を無視すると、すべてのアイコンが適切なグリッドに配置されます。
  • ウィジェットは、それが取ることができるすべての水平および垂直領域を満たすように拡張する必要があります。水平方向に拡大/縮小すると、各行に表示されるアイコンの数が増減する場合があります。
  • アイコンはグループ化されており、それらのグループは折りたたみ可能である必要があります。
  • ウィジェットの高さがそのスペースを超えると、垂直スクロールバーが表示されます。
4

1 に答える 1

7

あなたは実際にQListView/QListWidgetのためのより難解なオプションのいくつかを探しています。

トップレベルで、スクロール領域を管理するだけでなく、探している階層を追加QTreeWidgetまたは提供します。QTreeView

(展開された)の各リストされたアイテムは、それらに設定されQTreeXItemQListView/になります。QListWidgetsetViewMode(QListView::IconMode)

編集:上記で希望する正確な外観を得るには、おそらくQListViewを使用し、カスタムデリゲートを使用して、自分で描画を処理する必要があることに注意してください(希望どおりのテーマが見つからない場合)。ただし、Q * Widgetクラスは短いため、以下の短いPyQtソリューションをコーディングしましたが、それでも正しいレイアウトを取得する方法を示します。C ++を使用している場合は、同じQt関数呼び出しが適用されますが、明らかに簿記が多かれ少なかれある可能性があります。

import sys
from PyQt4 import QtGui, QtCore

class displayItem(QtGui.QWidget):  #A simple widget to display, just centers a digit in a 100x100 widget
    def __init__(self,num):
        QtGui.QWidget.__init__(self)
        self.size=100
        self.resize(self.size,self.size)
        self.setMinimumSize(self.size,self.size)
        self.text = num
    def paintEvent(self,event):
        p = QtGui.QPainter(self)
        p.drawText(self.size//2,self.size//2,str(self.text))

app = QtGui.QApplication(sys.argv)
widget = QtGui.QTreeWidget()
widget.setWindowTitle('simple tree')

#Build the list widgets
treeItem1 = QtGui.QTreeWidgetItem(widget)
treeItem1.setText(0,"TreeWidget Parent")   #Sets the "header" for your [+] box

list1 = QtGui.QListWidget()                #This will contain your icon list
list1.setMovement(QtGui.QListView.Static)  #otherwise the icons are draggable
list1.setResizeMode(QtGui.QListView.Adjust) #Redo layout every time we resize
list1.setViewMode(QtGui.QListView.IconMode) #Layout left-to-right, not top-to-bottom

listItem = QtGui.QListWidgetItem(list1)
listItem.setSizeHint(QtCore.QSize(100,100)) #Or else the widget items will overlap (irritating bug)
list1.setItemWidget(listItem,displayItem(1))

listItem = QtGui.QListWidgetItem(list1)     #Add a few more items
listItem.setSizeHint(QtCore.QSize(100,100))
list1.setItemWidget(listItem,displayItem(2))

listItem = QtGui.QListWidgetItem(list1)
listItem.setSizeHint(QtCore.QSize(100,100))
list1.setItemWidget(listItem,displayItem(3))

list1.setAutoFillBackground(True)                #Required for a widget that will be a QTreeWidgetItem widget
treeSubItem1 = QtGui.QTreeWidgetItem(treeItem1)  #Make a subitem to hold our list
widget.setItemWidget(treeSubItem1,0,list1)       #Assign this list as a tree item

treeItem2 = QtGui.QTreeWidgetItem(widget)        #Make a fake second parent
treeItem2.setText(0,"TreeWidget Parent II")

widget.show()           #kick off the app in standard PyQt4 fashion
sys.exit(app.exec_())
于 2010-09-03T21:44:04.837 に答える