2015-03-02 3 views
3

Итак, у меня есть этот QFrame, который является родительским виджетами (представлен кодом в коде). В этом виджете я хочу разместить QWidget с 10 px сверху (и 10 пикселей снизу, в результате чего он будет иметь высоту 140 пикселей, а родительский - 160 пикселей). QWidget будет иметь ряд пользовательских кнопок внутри него в вертикальной компоновке в области прокрутки, так что, когда высота сочетаемых кнопок превышает высоту QWidget's (140 пикселей), прокрутки автоматически устанавливаются. Поскольку прокрутка не для всего родительского виджета, но только для дочернего виджета, свиток должен применяться только к дочернему виджету. Вот мой код:QScrollArea работает не так, как ожидалось, с QWidget и QVBoxLayout

//this is a custom button class with predefined height and some formatting styles 
class MyButton: public QPushButton 
{ 

public: 
    MyButton(std::string aText, QWidget *aParent); 

}; 

MyButton::MyButton(std::string aText, QWidget *aParent): QPushButton(QString::fromStdString(aText), aParent) 
{ 
    this->setFixedHeight(30); 
    this->setCursor(Qt::PointingHandCursor); 
    this->setCheckable(false); 
    this->setStyleSheet("background: rgb(74,89,98); color: black; border-radius: 0px; text-align: left; padding-left: 5px; border-bottom: 1px solid black;"); 
} 

//this is where I position the parent widget first, and then add sub widget 
this->setGeometry(x,y,width,160); 
this->setStyleSheet("border-radius: 5px; background:red;"); 

//this is the widget which is supposed to be scrollable 
QWidget *dd = new QWidget(this); 
dd->setGeometry(0,10,width,140); 
dd->setStyleSheet("background: blue;"); 

QVBoxLayout *layout = new QVBoxLayout(); 
dd->setLayout(layout); 

for (int i = 0; i < fValues.size(); i++) 
{ 
    MyButton *button = new MyButton(fValues[i],dd); 
    layout->addWidget(button); 
} 

QScrollArea *scroll = new QScrollArea(this); 
scroll->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); 
scroll->setWidget(dd); 

Вопреки моим ожиданиям, это то, что я получаю (прикрепленное изображение). Что я делаю неправильно, и как я могу это исправить?

enter image description here

+0

Это имеет смысл наблюдать отладочные сообщения. – AlexanderVX

ответ

5

Вы испортили стек элементов. Идея иметь прокручиваемую область, как это:

  • на дне является родительским виджетом (например QDialog)
  • на вершине этого прокручивать площадь (QScrollArea) фиксированного размера
  • на вершине этого виджет (QWidget) некоторого размера, где обычно только часть его видна (это должно быть больше, чем ScrollArea)
  • на вершине этого расположение
  • и последнее: расположение управляет дочерними элементами (пара QPushButton)

Попробуйте этот код:

int 
main(int _argc, char** _argv) 
{ 
    QApplication app(_argc, _argv); 

    QDialog * dlg = new QDialog(); 
    dlg->setGeometry(100, 100, 260, 260); 

    QScrollArea *scrollArea = new QScrollArea(dlg); 
    scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); 
    scrollArea->setWidgetResizable(true); 
    scrollArea->setGeometry(10, 10, 200, 200); 

    QWidget *widget = new QWidget(); 
    scrollArea->setWidget(widget); 

    QVBoxLayout *layout = new QVBoxLayout(); 
    widget->setLayout(layout); 

    for (int i = 0; i < 10; i++) 
    { 
     QPushButton *button = new QPushButton(QString("%1").arg(i)); 
     layout->addWidget(button); 
    } 

    dlg->show(); 

    return app.exec(); 
} 

Стоит отметить о QScrollArea::setWidgetResizable, который регулирует ребенок размера виджета динамически в соответствии с его содержанием.

И результат выглядит следующим образом:

enter image description here

Смежные вопросы