【问题标题】:Qt Grid Layout doesn't fit into Scroll Area [duplicate]Qt网格布局不适合滚动区域[重复]
【发布时间】:2021-08-16 23:12:01
【问题描述】:

我正在尝试将包含一些按钮的网格视图放入滚动区域,但我不知道为什么网格布局只适合滚动区域的初始大小(它不会不利,所以我可以使用滚动条查看所有元素)。

ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
QGridLayout* lay=new QGridLayout(this);
QPushButton *name[100];
for(int i=0;i<10;i++){

    QString str1="project"+QString::number(i);
    QString str2="3/6task";
    QString str3="ALEX";

    name[i]=new QPushButton(str1);

 
    name[i]->setObjectName("btn_1");
    name[i]->setStyleSheet("QPushButton#btn_1{background:transparent;Text-align:left;font-family:century gothic;font-size:18px;color:red;}"
                            "QPushButton#btn_1:hover{color:yellow;Font-size:22px;}");

    name[i]->setFixedSize(100,40);
    lay->addWidget(name[i]);
 
}
ui->scrollArea->setLayout(lay);

结果在下一张照片中:

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    我是这样修好的:

       ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
        QGridLayout *lay = new QGridLayout(ui->centralwidget);
        lay->addWidget(ui->scrollArea, 0, 0, 1, 1);
    
        auto  gridLayout = new QGridLayout(ui->scrollAreaWidgetContents);
        gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
        auto  widget = new QWidget(ui->scrollAreaWidgetContents);
        widget->setObjectName(QString::fromUtf8("widget"));
        auto  gridLayout_2 = new QGridLayout(widget);
        gridLayout_2->setObjectName(QString::fromUtf8("gridLayout_2"));
    
        gridLayout->addWidget(widget, 0, 0, 1, 1);
    
        for (int i = 0; i < 10; i++)
        {
            QString      str1 = "project" + QString::number(i);
            QString      str2 = "3/6task";
            QString      str3 = "ALEX";
            QPushButton *btn  = new QPushButton(str1);
    
    
            btn->setObjectName(QString("btn_%1").arg(i));
            btn->setStyleSheet("QPushButton#btn_1{background:transparent;Text-align:left;font-family:century gothic;font-size:18px;color:red;}"
                               "QPushButton#btn_1:hover{color:yellow;Font-size:22px;}");
    
            btn->setFixedSize(100, 40);
            widget->layout()->addWidget(btn);
        }
    }
    

    【讨论】:

    • 非常感谢!但是你能解释一下你在那里做了什么吗?我不明白我做错了什么
    • 我创建了一个小部件并将其放入滚动区域并为按钮创建网格布局并将小部件设置为父级,当您使用 for 循环时,每次创建按钮和新按钮时都不需要数组最后将其添加到小部件的布局中。
    • 在滚动区域你不能直接添加你的按钮,但是它有setwidget功能,问题是它只设置了一个widget。所以我创建了一个小部件并在那里添加按钮。
    • 但是grid_layout2没用对吧?
    • @BadeaV 滚动区域的一种网格布局包含小部件,小部件内部的一种网格布局包含按钮,网格布局 2 用于按钮
    【解决方案2】:

    您必须使用以下代码:

    此代码已经过测试。

    QScrollArea* scroll = new QScrollArea(this);
    scroll->setGeometry(50,0,250,300);
    scroll->setWidgetResizable(true);
    
    QWidget *container = new QWidget;
    scroll->setWidget(container);
    QGridLayout* lay = new QGridLayout(container);
    
    QPushButton *name[100];
    for(int i = 0; i < 20; ++i) {
        name[i]=new QPushButton(scroll);
        lay->addWidget(name[i]);
    }
    

    当然你也可以修改按钮和滚动区域。

    使用ui-&gt;scrollArea没有问题

    【讨论】:

      【解决方案3】:

      当您实际需要将QGridLayout 应用到使用QScrollArea::setWidget 的滚动区域管理的QWidget 时,您将QGridLayout 应用到QScollArea...

      #include <QApplication>
      #include <QGridLayout>
      #include <QPushButton>
      #include <QScrollArea>
      #include <QString>
      #include <QWidget>
      
      int main (int argc, char **argv)
      {
          QApplication app(argc, argv);
          QScrollArea scroll_area;
          scroll_area.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
          QWidget viewport;
          QGridLayout layout(&viewport);
          for (int i = 0; i < 10; ++i) {
              QString str1 = "project" + QString::number(i);
              QString str2 = "3/6task";
              QString str3 = "ALEX";
      
              auto *pb = new QPushButton(str1);
      
              pb->setObjectName("btn_1");
              pb->setStyleSheet("QPushButton#btn_1{background:transparent;Text-align:left;font-family:century gothic;font-size:18px;color:red;}"
                                "QPushButton#btn_1:hover{color:yellow;Font-size:22px;}");
      
              pb->setFixedSize(100,40);
              layout.addWidget(pb);
          }
          scroll_area.setWidget(&viewport); 
          scroll_area.show();
          return app.exec();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-16
        • 2015-03-06
        • 2021-11-04
        相关资源
        最近更新 更多