2012-03-11 35 views
6

Tôi muốn điền một số QGridLayout với QWidgets. QWidgets cần xuất hiện ở góc trên cùng bên trái và trên cùng bên phải và tiến hành điền xuống dưới sau mỗi hàng được điền bằng QWidgets. Một ví dụ về GUI tương tự và quen thuộc là cách Apple sắp xếp các ứng dụng của nó trên màn hình chính của iPhone hoặc iPad. Các ứng dụng đi từ trên trái sang phải trên cùng và tiếp tục đi xuống sau mỗi hàng được lấp đầy.Làm thế nào để điền vào một QGridLayout từ trên trái sang phải?

Ngay bây giờ, bất cứ khi nào tôi thêm yếu tố, chúng chiếm toàn bộ màn hình và/hoặc không được thêm bên cạnh nhau.

Đây là mã ví dụ về những gì tôi đang làm

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

tôi tiến hành cập nhật m_currentColumn và m_currentRow như mong đợi. Sau một số cột nhất định, tôi yêu cầu nó thay đổi sang hàng tiếp theo và không có gì xảy ra. Tôi đã xác nhận thông qua gỡ lỗi rằng nó là vô hiệu nhổ ra đúng hàng và cột.)

Cuối cùng, tôi sẽ cần phải ném trên QScrollArea để người ta có thể cuộn xuống lưới.

Kích thước của mỗi QWidget sẽ giống nhau. Nếu tôi có thể nhận được bất kỳ sự trợ giúp nào liên quan đến việc phân loại lưới đúng cách, nó sẽ được đánh giá cao.

EDIT: Sử dụng câu trả lời bên dưới, tôi đã quản lý để sắp xếp các mục của mình theo đúng thứ tự. Tuy nhiên, có một lượng lớn không gian ở giữa tất cả các phần tử theo hướng thẳng đứng. Điều này không bị giảm bớt bằng cách thay đổi thuộc tính verticalSpacing, như tôi nghĩ. Có ai biết cách tiến hành không?

Trả lời

5

Viết bố trí lưới của riêng mình, một cái gì đó như thế này:

Tiêu đề

#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 

Nguồn

#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); 
} 

thử nghiệm trong một cửa sổ chính

#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() 
{ 

} 

quả
enter image description here

Trong khi đó đã là một mục tại một vị trí nhất định, chuyển sang vị trí tiếp theo trong cách bố trí lưới điện, trong đó có một số cột tối đa là 4 trong ví dụ của tôi. Tôi chỉ chuyển sang cột tiếp theo cho đến khi tôi đạt đến cột thứ 4. Sau đó, tôi đặt lại cột về 0 và chuyển sang hàng tiếp theo. Tôi làm điều này miễn là đã có một món đồ. Ngay khi không có vật phẩm nào ở nơi đó, tôi đặt tiện ích của tôi ở đó.

Đây chỉ là ví dụ nhanh, nhưng có thể là đủ để bạn làm việc cùng.

Bạn nên tăng cường nó bằng cách xử lý lỗi, xem ra cho vòng lặp vô tận và như vậy ...

Các vấn đề liên quan