【问题标题】:Fixed size widget in QBoxLayout in QScrollAreaQScrollArea 中 QBoxLayout 中的固定大小小部件
【发布时间】:2014-11-20 09:16:52
【问题描述】:

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

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

但结果相同。

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

【问题讨论】:

    标签: c++ qt scroll scrollbar


    【解决方案1】:

    好的,我在写问题的时候找到了答案,所以其他人似乎也有同样的问题,我用一个完整的例子发布了解决方案。
    解决方案是在QScrollArea之前通过另一个QWidget,因此它给出了以下结构(在bracketts中带有parent)[并在方括号中输入]

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

    【讨论】:

    • 注意,当你使用Qt Creator设计gui时,它会自动在QScrollArea中添加一个QWidget,命名为scrollAreaWidgetContents。手动添加布局时,应将其分配给此小部件,而不是滚动区域。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 2014-03-08
    相关资源
    最近更新 更多