QgridLayoutを左から右にどのように塗りつぶしますか?
-
12-12-2019 - |
質問
QGridLayout
を埋めたいと思います。 QWidgets
は、左上から最上位の方法で現れ、各行が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を更新します。一定量の列の後、私はそれを次の行に変更するように言います、そして何も起こりません。私はそれが正しい行と列を吐き出していることをデバッグして確認しました。)
最終的には、GridをスクロールできるようにQWidgets
を投入する必要があります。
各QScrollArea
のサイズは同じです。グリッドを正しく整理することに関して助けを得ることができれば、それは多くの理解されるでしょう。
編集:以下の答えを使用して、私は自分のアイテムを正しい順序で並べ替えることができました。しかしながら、垂直方向の全ての要素間には大きなスペースがある。私が思うように、垂直方向の特性を変えることによってこれは排除されません。誰もが進む方法を知っていますか?
解決
あなた自身のグリッドレイアウトを書いて、このようなもの:
ヘッダー
.
#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にリセットして次の行に切り替えます。私はすでにアイテムがある限りこれをします。その場所にアイテムがないとすぐに、私はそこに私のウィジェットを置きます。
これは単なる迅速な例ですが、それはあなたが一緒に働くことが十分であるかもしれません。
エラー処理でそれを強化し、無限ループやそのようなものに注意する必要があります...
他のヒント
このQTの例のフローライウトあなたが探しているもの。