2016-12-16 28 views
0

我想要有一个垂直布局的动态列表QProgessBars。但事情是我想让他们中的一些水平移动。例如:具有不同水平位置的进度条的布局

@@@@@@@@@@@@@@@@@ 
    @@@@@@@@@@@ 
     @@@@@@@@@@@ 
@@@@@@ 

当我移动部件的布局是这样的:

sl->move(10, 0); 

没有任何反应。

我也使用QGridLayout与间隔尝试:

QGridLayout * lay = new QGridLayout(); 
lay->setAlignment(Qt::AlignLeft|Qt::AlignTop); 

for (int i = 1; i < 15; ++i) { 
    QProgressBar * sl = new QProgressBar(); 
    QSpacerItem * sp = new QSpacerItem(10, 10 + i); 
    lay->addWidget(sl, i, 0); 
    lay->addItem(sp, i, 0); 
} 

我有没有办法做到这一点编程?

回答

0

布局嵌套,就像他们会在HTML中做的那样。有四个垂直布局(或三个,如果第一行只有进度条)其中有水平布局 Example done in designer

但是使用网格作为顶部布局将允许在边上添加边距。 当然,你可以通过编程来完成。我已经展示了Designer如何看起来如此,但设计师实际上做的是生成简单的线性代码。相反,你可以这样做。

生成的代码:

if (Dialog->objectName().isEmpty()) 
      Dialog->setObjectName(QString::fromUtf8("Dialog")); 
     Dialog->resize(504, 377); 
     gridLayoutWidget = new QWidget(Dialog); 
     gridLayoutWidget->setObjectName(QString::fromUtf8("gridLayoutWidget")); 
     gridLayoutWidget->setGeometry(QRect(9, 9, 481, 351)); 
     gridLayout = new QGridLayout(gridLayoutWidget); 
     gridLayout->setObjectName(QString::fromUtf8("gridLayout")); 
     gridLayout->setContentsMargins(0, 0, 0, 0); 
     horizontalLayout_3 = new QHBoxLayout(); 
     horizontalLayout_3->setObjectName(QString::fromUtf8("horizontalLayout_3")); 
     horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); 

     horizontalLayout_3->addItem(horizontalSpacer); 

     progressBar_2 = new QProgressBar(gridLayoutWidget); 
     progressBar_2->setObjectName(QString::fromUtf8("progressBar_2")); 
     progressBar_2->setValue(24); 

     horizontalLayout_3->addWidget(progressBar_2); 

     horizontalSpacer_2 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); 

     horizontalLayout_3->addItem(horizontalSpacer_2); 


     gridLayout->addLayout(horizontalLayout_3, 1, 0, 1, 1); 

     horizontalLayout_2 = new QHBoxLayout(); 
     horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2")); 
     horizontalSpacer_3 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); 

     horizontalLayout_2->addItem(horizontalSpacer_3); 

     progressBar_3 = new QProgressBar(gridLayoutWidget); 
     progressBar_3->setObjectName(QString::fromUtf8("progressBar_3")); 
     progressBar_3->setValue(24); 

     horizontalLayout_2->addWidget(progressBar_3); 


     gridLayout->addLayout(horizontalLayout_2, 2, 0, 1, 1); 

     horizontalLayout = new QHBoxLayout(); 
     horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout")); 
     progressBar_4 = new QProgressBar(gridLayoutWidget); 
     progressBar_4->setObjectName(QString::fromUtf8("progressBar_4")); 
     progressBar_4->setValue(24); 

     horizontalLayout->addWidget(progressBar_4); 

     horizontalSpacer_4 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); 

     horizontalLayout->addItem(horizontalSpacer_4); 


     gridLayout->addLayout(horizontalLayout, 3, 0, 1, 1); 

     horizontalLayout_4 = new QHBoxLayout(); 
     horizontalLayout_4->setObjectName(QString::fromUtf8("horizontalLayout_4")); 
     progressBar = new QProgressBar(gridLayoutWidget); 
     progressBar->setObjectName(QString::fromUtf8("progressBar")); 
     progressBar->setValue(24); 

     horizontalLayout_4->addWidget(progressBar); 


     gridLayout->addLayout(horizontalLayout_4, 0, 0, 1, 1); 
2

嗨,你需要使用这个QGridLayout::addWidget版本。例如,当你执行

grid->addWidget(w1, 0, 0, 1, 5); 
grid->addWidget(w2, 1, 1, 2, 3); 
grid->addWidget(w3, 3, 0, 1, 5); 

最终图形用户界面将是这个样子:

w1 w1 w1 w1 w1 
    w2 w2 w2 
    w2 w2 w2 
w3 w3 w3 w3 w3 

你可以看到网格作为一个二维数组。所以w2从grid[1][1]开始,跨越2行和3列。由于w2跨越2行,所以w3应该从w1的行+2(即3)开始。

+1

这也会起作用,尽管它增加了对小部件的附加限制。这可能是一件好事或坏事,取决于形式构建。带有跨部件的网格布局对于将面板放置到布局中非常有用,该布局将包含其他小部件 – Swift