2014-10-09 39 views
4

我正在研究一個使用Qt的QTreeView來顯示分層數據的應用程序。在某些情況下,層次中的單個葉子將包含100,000個子節點。我發現QTreeView不能處理太多的子節點。QTreeView不能縮放 - 是否有解決方法來獲取較少的ModelIndexes?

這是因爲當用戶打開一個父節點時,Qt獲取所有的子節點'ModelIndexes,而不僅僅是填充QTreeView顯示所需的子節點。

它爲什麼要這樣做,是否有任何解決方法使其獲取更少的ModelIndexes

+1

您是否將視圖設置爲使用統一的行高? – cmannett85 2014-10-09 22:39:32

+0

你的意思是「無法處理」。我正在使用1KK +項目的樹視圖,一切正常。但我們正在使用自定義,性能優化的模型:) – 2014-10-10 09:25:21

+0

「無法處理」,我的意思是說,QT使用了我所有的內存和崩潰。它試圖獲取所有子節點的ModelIndexes,而不僅僅是填充顯示器所需的那些 – Cedric 2014-10-10 21:26:20

回答

0

由於QTreeWidget(我正在使用QTreeWidget來簡化),我以前的答案不幸沒用,因爲用戶無法設置滑塊。 您的目標可以通過使用額外的QScrollBar來實現。

MainWidget.h

class MainWidget : public QWidget 
{ 
    Q_OBJECT 
public: 
    MainWidget(QWidget *parent = 0); 
private: 
    QTreeWidget* Tree; 
    QScrollBar* Bar; 
private slots: 
    void tree(QTreeWidgetItem*); 
    void slider(); 
}; 

MainWidget.cpp

MainWidget::MainWidget(QWidget *parent): QWidget(parent) { 
    Tree = new QTreeWidget(); 
    Tree->header()->hide(); 
    connect(Tree,SIGNAL(itemExpanded(QTreeWidgetItem*)),this,SLOT(tree(QTreeWidgetItem*))); 
    Bar = new QScrollBar(Qt::Vertical); 
    Bar->setRange(0,100000); 
    connect(Bar,SIGNAL(sliderReleased()),this,SLOT(slider())); 
    for(uint i=0;i<10;i++) { 
     QTreeWidgetItem* Item=new QTreeWidgetItem(QStringList()<<QString::number(i)); //Add 10 topLevelItems 
     Tree->addTopLevelItem(Item); 
     for(uint j=0;j<30;j++) { 
      Item->addChild(new QTreeWidgetItem(QStringList()<<QString::number(j))); //Add first 30 items 
     } 
    } 
    QHBoxLayout* Lay = new QHBoxLayout(); 
    Lay->addWidget(Tree); 
    Lay->addWidget(Bar); 
    setLayout(Lay); 
} 
void MainWidget::tree(QTreeWidgetItem* I) { //SLOT Only one item expanded 
    Tree->blockSignals(true); //Block SIGNAL(itemExpanded()) 
    Tree->collapseAll(); 
    Tree->expandItem(I); 
    Tree->blockSignals(false);//Allow SIGNAL(itemExpanded()) 
} 
void MainWidget::slider() { //SLOT manage tree 
    for (int i=0;i<Tree->topLevelItemCount();i++) { 
     if (Tree->topLevelItem(i)->isExpanded()) { 
      for(uint j=Tree->topLevelItem(i)->childCount(); j>0;j--) { //Clear children 
       delete Tree->topLevelItem(i)->child(j-1); 
      } 
      uint Value = Bar->value(); 
      for(uint j=0; j<30; j++) { 
       Tree->topLevelItem(i)->addChild(new QTreeWidgetItem(QStringList()<<QString::number(Value+j))); //Add 30 new children 
      } 
      break; 
     } 
    } 
} 

這種方式,你有一個滑塊滾動QTreeWidget,第二個改變擴大topLevelItem的內容。

相關問題