2015-06-05 3 views
1

Я пытаюсь выложить сетку квадратных пользовательских (подклассифицированных) QWidgets внутри QGridLayout и QScrollArea.Квадратные пользовательские QWidgets внутри QGridLayout внутри QScrollArea

Способ, которым я хочу работать, - это выбрать количество столбцов QGridLayout и создать квадраты правильных размеров.

То, что я пытался делать уже

  1. укладки вручную из/изменение размера QWidgets, но это неаккуратно и медленно
  2. Установка QScrollArea::widgetsResized в истину, которая делает изменение ширины правильно, но не высота, см. screenshot.

Я попытался установить QSizePolicy и первостепенную QWidget::heightForWidth вместе с установкой QScrollArea::widgetsResized в моем обычае QWidget-производного класса, например, так:

CustomWidget::CustomWidget(...) 
{ 
    ... 

    QSizePolicy policy(QSizePolicy::Preferred, QSizePolicy::Preferred); 
    policy.setHeightForWidth(true); 

    setSizePolicy(policy); 
} 

... 

int CustomWidget::heightForWidth(int width) const 
{ 
    return width; // square 
} 

Но CustomWidget::heightForWidth никогда не вызывается.

Любая помощь будет оценена по достоинству.

EDIT: Я уже сделал то, что предложил this answer, мои пользовательские виджеты находятся в макете (QGridLayout).

+0

возможно дубликат [QWidget :: heightForWidth() не вызывается] (http://stackoverflow.com/questions/17708449/qwidgetheightforwidth-is-not-called) –

+0

ли вам попробуйте вызвать 'setFixedSize' для каждого виджета? –

+0

@PavelStrakhov Я не хочу фиксированного размера, я хочу ту же самую высоту, что и каждая (переменная) ширина. Я попытался переопределить 'sizeHints()', но это не сработало для этого, так как мне нужно возвращать как ширину, так и высоту в этом методе. – blashyrk

ответ

3

Кажется, что вам не хватает hasHeightForWidth. Следующий фрагмент кода работает отлично:

class MyWidget : public QTextEdit { 
public: 
    MyWidget() {} 
    int heightForWidth(int width) const { 
    return width; 
    } 
    bool hasHeightForWidth() const { 
    return true; 
    } 
}; 
//... 
QScrollArea area; 
QWidget* widget = new QWidget(); 
QGridLayout* layout = new QGridLayout(widget); 
area.setWidget(widget); 
area.setWidgetResizable(true); 
for(int row = 0; row < 10; row++) { 
    for(int column = 0; column < 4; column++) { 
    layout->addWidget(new MyWidget(), row, column); 
    } 
} 
area.show(); 
Смежные вопросы