7

を で埋めたいと思いQGridLayoutますQWidgetsQWidgets左上から右上に表示され、各行がQWidgets. よく似た GUI の例として、Apple が iPhone や iPad のホーム画面でアプリを並べ替える方法があります。アプリは左上から右上に移動し、各行がいっぱいになると下に移動します。

現在、要素を追加するたびに、要素が画面全体を占めるか、隣り合って追加されません。

これは私がやっていることのサンプルコードです

m_gridLayout = new QGridLayout(this);
this->setLayout(m_gridLayout);
m_gridLayout->addWidget(widgetToBeAdded, m_currentRow, m_currentColumn, Qt::AlignLeft);

期待どおりに m_currentColumn と m_currentRow を更新します。一定量の列の後、次の行に変更するように指示しましたが、何も起こりません。実際に正しい行と列を吐き出していることをデバッグで確認しました。)

QScrollArea最終的には、グリッドを下にスクロールできるようにする必要があります。

それぞれのサイズはQWidget同じになります。グリッドを適切にソートすることに関して何か助けを得ることができれば、それは大歓迎です.

編集:以下の回答を使用して、アイテムを正しい順序で並べ替えることができました。ただし、垂直方向のすべての要素の間には大きなスペースがあります。私が思うように、これは verticalSpacing プロパティを変更しても回避されません。誰も続行方法を知っていますか?

4

2 に答える 2

5

次のような独自のグリッド レイアウトを記述します。

ヘッダ

#ifndef MY_GRID_LAYOUT_H
#define MY_GRID_LAYOUT_H

#include <QGridLayout>

class my_grid_layout : public QGridLayout
{
public:
    my_grid_layout(QWidget *parent, int max_column_count );
    ~my_grid_layout();

    void add_widget( QWidget* p_widget );

private:
    int m_max_column_count;
};

#endif // MY_GRID_LAYOUT_H

ソース

#include "my_grid_layout.h"

my_grid_layout::my_grid_layout(QWidget *parent, int max_column_count)
    : QGridLayout(parent)
{
    m_max_column_count = max_column_count;
}

my_grid_layout::~my_grid_layout()
{

}

void my_grid_layout::add_widget( QWidget* p_widget )
{
    int current_row = 0;
    int current_column = 0;

    while( itemAtPosition(current_row, current_column) != 0 )
    {
        if( current_column == (m_max_column_count-1) )
        {
            current_column = 0;
            ++current_row;
        }
        else
        {
            ++current_column;
        }
    }

    QGridLayout::addWidget( p_widget, current_row, current_column );
}

メイン ウィンドウでテストする

#include "test_1.h"

Test_1::Test_1(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    m_grid_layout = new my_grid_layout(this,4);

    m_grid_layout->add_widget( new QPushButton( "Widget 0", this ) );
    m_grid_layout->add_widget( new QPushButton( "Widget 1", this ) );
    m_grid_layout->add_widget( new QPushButton( "Widget 2", this ) );
    m_grid_layout->add_widget( new QPushButton( "Widget 3", this ) );
    m_grid_layout->add_widget( new QPushButton( "Widget 4", this ) );
    m_grid_layout->add_widget( new QPushButton( "Widget 5", this ) );
    m_grid_layout->add_widget( new QPushButton( "Widget 6", this ) );
    m_grid_layout->add_widget( new QPushButton( "Widget 7", this ) );
    m_grid_layout->add_widget( new QPushButton( "Widget 8", this ) );
    m_grid_layout->add_widget( new QPushButton( "Widget 9", this ) );
    m_grid_layout->add_widget( new QPushButton( "Widget 10", this ) );
    m_grid_layout->add_widget( new QPushButton( "Widget 11", this ) );
    m_grid_layout->add_widget( new QPushButton( "Widget 12", this ) );
    m_grid_layout->add_widget( new QPushButton( "Widget 13", this ) );



    QWidget* central_widget = new QWidget(this);
    central_widget->setLayout(m_grid_layout);

    setCentralWidget(central_widget);
}

Test_1::~Test_1()
{

}

結果
ここに画像の説明を入力

特定の位置に既にアイテムがある場合、グリッド レイアウトの次の位置に切り替えます。この例では、最大列数は 4 です。4 番目の列に到達するまで、次の列に切り替えます。次に、列を 0 にリセットし、次の行に切り替えます。すでにアイテムがある限り、これを行います。その場所にアイテムがなくなるとすぐに、ウィジェットをそこに置きます。

これは簡単な例にすぎませんが、おそらくこれで十分です。

エラー処理で強化する必要があります。無限ループなどに注意してください...

于 2012-03-12T00:56:34.357 に答える
3

この Qt の例のFlowLayoutは、探しているものかもしれません。

于 2012-03-12T00:56:10.813 に答える