2014-09-25 38 views
1

我正在开发一个在嵌入式系统上全屏运行的Qt应用程序(带有4d 4.3''触摸屏的BeagleBone Black)。我想显示不同数量的固定宽度自定义小部件(假设这些是简单的滑块)。所以我的想法是有一个QScrollArea,我使用Qt Designer添加到了我的表单中,它使用了我的屏幕空间。然后,把我想要的QSlider的数量放在QHBoxLayout中。最后,在滚动区域显示QHBoxLayout。这样,我想要一个水平滚动条出现,如果QSlider要求的数量很大以显示在屏幕上。我也希望QSlider具有恒定的宽度(我的自定义小部件具有固定的宽度)。所以这是我写的代码:QScrollArea中的QBoxLayout中的固定大小的小部件

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    // ui->scrollArea is a QScrollArea generated by Qt Designer 
    ui->setupUi(this); 
    QHBoxLayout * layout = new QHBoxLayout(ui->scrollArea); 
    layout->setSpacing(1); 
    QSlider * slider1 = new QSlider(layout->widget()); 
    QSlider * slider2 = new QSlider(layout->widget()); 
    QSlider * slider3 = new QSlider(layout->widget()); 
    QSlider * slider4 = new QSlider(layout->widget()); 
    slider1->setFixedSize(200, 200); 
    slider2->setFixedSize(200, 200); 
    slider3->setFixedSize(200, 200); 
    slider4->setFixedSize(200, 200); 
    layout->addWidget(slider1); 
    layout->addWidget(slider2); 
    layout->addWidget(slider3); 
    layout->addWidget(slider4); 
    ui->scrollArea->setLayout(layout); 
} 

结果给出了一个没有任何滚动条和重叠滑块的方框。

我尝试添加:

slider1->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); 
slider2->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); 
slider3->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); 
slider4->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); 

但相同的结果。

那么在固定大小的滚动区域中显示固定大小内容的正确方法是什么?

回答

1

好吧,我在写问题的时候发现了答案,所以其他人似乎也有同样的问题,我用一个完整的例子发布解决方案。
的解决方案是由QScrollArea之前另一QWidget的通过,所以它提供了以下结构(与brakets亲本)[和正方形brakets型]

ui->scrollArea [QScrollArea] 
|\ 
| widget (ui->scrollArea) [QWidget] 
| |\ 
| | layout (widget) [QHBoxLayout] 
| | |\ 
| | | slider1 (layout->widget()) [QSlider] 
| | | slider2 (layout->widget()) [QSlider] 
| | | slider3 (layout->widget()) [QSlider] 
| | | slider4 (layout->widget()) [QSlider] 

其是由下面的代码来实现:

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    QWidget * widget = new QWidget(ui->scrollArea); 
    QHBoxLayout * layout = new QHBoxLayout(widget); 
    layout->setSpacing(1); 
    QSlider * slider1 = new QSlider(layout->widget()); 
    QSlider * slider2 = new QSlider(layout->widget()); 
    QSlider * slider3 = new QSlider(layout->widget()); 
    QSlider * slider4 = new QSlider(layout->widget()); 
    slider1->setFixedSize(200, 200); 
    slider2->setFixedSize(200, 200); 
    slider3->setFixedSize(200, 200); 
    slider4->setFixedSize(200, 200); 
    slider1->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); 
    slider2->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); 
    slider3->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); 
    slider4->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); 
    layout->addWidget(slider1); 
    layout->addWidget(slider2); 
    layout->addWidget(slider3); 
    layout->addWidget(slider4); 
    widget->setLayout(layout); 
    ui->scrollArea->setWidget(widget); 
} 
+1

请注意,当您使用Qt Creator来设计gui时,它会自动在名为'scrollAreaWidgetContents'的QScrollArea内添加一个QWidget。手动添加布局时,应将其分配给此小部件,而不是滚动区域。 – vsz 2015-09-24 06:05:29