2017-02-07 13 views
0

Qtフレームワークを使用してグラフィカルユーザーインターフェイスを構築しています。私はQGridLayoutを使って自分のQWidgetsをきれいに配置します。
GUIは次のようになります。QWidgetsをレイアウトの途中に挿入する方法は?

enter image description here

私のアプリケーションは、定期的に実行時にGUIに新しいウィジェットが追加されます。これらの新しいウィジェットは通常、QLayoutの最後に追加されるのではなく、中間のどこかに追加されます。

これを行う手順はちょっと面倒です。上記の図に適用すると、QGridLayoutからwidg_Cwidg_D、...を取り出す必要があります。次に、widg_xwidg_yを追加し、最後にもう一度他のウィジェットを元に戻します。
これは私がQGridLayoutからウィジェットを削除する方法です:

for i in reversed(range(myGridLayout.count())): 
    self.itemAt(i).widget().setParent(None) 
### 

限り、あなたは、ウィジェットの少量を扱っているとして、この手順は災害ではありません。しかし、私のアプリケーションでは、おそらく50以上の小さなウィジェットをたくさん表示しています!この手順が進行中の間、アプリケーションは1秒間フリーズします。これはユーザーにとって非常に迷惑です。
他のウィジェットを取り出す必要なく、QLayoutのどこかにウィジェットを挿入する方法はありますか?


EDIT:どうやらQVBoxLayoutのためのソリューションは非常に簡単です。 addWidget(..)の代わりに関数insertWidget(..)を使用してください。ドキュメントはこのリンクにあります:http://doc.qt.io/qt-5/qboxlayout.html#insertWidget
残念ながら、私はQGridLayoutのための同様の機能を見つけることができませんでした。


EDIT:多くの人々は当然のウィジェットの多くをバック置くと、パフォーマンスの問題を引き起こしてはならないことを述べた - それは確かに非常に高速です(あなたがそれを指摘して@ekhumoro感謝)。明らかに、私が直面したパフォーマンスの問題は、ウィジェットを戻すアルゴリズムと関係がありました。それはQGridLayoutの右の座標にすべてのウィジェットを配置するかなり複雑な再帰アルゴリズムです。これにより、ディスプレイに「フリッカー」が発生しました。ウィジェットは取り出され、(アルゴリズムのために)少し遅れて内部に戻され、ちらつきが発生します。


EDIT

は、私は簡単にQGridLayoutに新しい行を挿入することができるような解決策を見つけました。新しい行を挿入するということは、すべてのウィジェットを一から取り除いて置き換える必要がないことを意味します。したがって、高価な再帰アルゴリズムを実行する必要はありません。
ソリューションは私の答えで見つけることができます。

+0

を、' insertWidget'方法、およびいくつかの同様の質問があります。 – mbjoe

+0

あなたのGUIに間違ったモデルを選択したと思います。このような動的コンテンツの場合は、例えば 'QTableWidget'を使用することができます。それはすべての項目の挿入/削除などの世話をする – vahancho

+0

ウィジェットを挿入するためのコードに問題がなければなりません.50ウィジェットは簡単な番号なので、ウィジェットを挿入するには問題があります。私はいくつかのテストを行い、2000ウィジェットを含むレイアウトの上部にウィジェットを挿入し、他のすべてのウィジェットを下に移動するのに0.5秒もかかりません。 – ekhumoro

答えて

0

ありがとう、@ Stuart Fisher、@vahancho、@mbjoeありがとうございます。私は結局その問題を解決する方法を見つけました。私はもうQGridLayout()を使用しません。代わりに、私はそれがグリッドレイアウトであるかのように振る舞うようにQVBoxLayoutの周りにラッパーを構築し、新しい行を挿入するために余分な機能を: `QVBoxLayout`について

class CustomGridLayout(QVBoxLayout): 
    def __init__(self): 
     super(CustomGridLayout, self).__init__() 
     self.setAlignment(Qt.AlignTop) # !!! 
     self.setSpacing(20) 


    def addWidget(self, widget, row, col): 
     # 1. How many horizontal layouts (rows) are present? 
     horLaysNr = self.count() 

     # 2. Add rows if necessary 
     if row < horLaysNr: 
      pass 
     else: 
      while row >= horLaysNr: 
       lyt = QHBoxLayout() 
       lyt.setAlignment(Qt.AlignLeft) 
       self.addLayout(lyt) 
       horLaysNr = self.count() 
      ### 
     ### 

     # 3. Insert the widget at specified column 
     self.itemAt(row).insertWidget(col, widget) 

    '''''' 

    def insertRow(self, row): 
     lyt = QHBoxLayout() 
     lyt.setAlignment(Qt.AlignLeft) 
     self.insertLayout(row, lyt) 

    '''''' 

    def deleteRow(self, row): 
     for j in reversed(range(self.itemAt(row).count())): 
      self.itemAt(row).itemAt(j).widget().setParent(None) 
     ### 
     self.itemAt(row).setParent(None) 

    def clear(self): 
     for i in reversed(range(self.count())): 
      for j in reversed(range(self.itemAt(i).count())): 
       self.itemAt(i).itemAt(j).widget().setParent(None) 
      ### 
     ### 
     for i in reversed(range(self.count())): 
      self.itemAt(i).setParent(None) 
     ### 

    '''''' 
関連する問題