在Qt中使用for循环创建和布置小部件

时间:2015-03-24 16:53:15

标签: c++ qt

所以我想在Qt中创建5个按钮,但是只创建一个按钮并将其放入for循环中,这样我就不必手动创建5个按钮。我尝试了不同的方法,但都证明是徒劳的。我是C ++和Qt的新手。

以下是代码;

show.h

#ifndef SHOW_H
#define SHOW_H

#include <QDialog>
#include <QPushButton>
#include <QVBoxLayout>

class Show : public QDialog {
    Q_OBJECT

public:
    explicit Show(QWidget *parent = 0);
    ~Show();

private:
    QPushButton *button;

};

#endif // SHOW_H

show.cpp

#include "show.h"
#include "ui_show.h"

Show::Show(QWidget *parent) : QDialog(parent) {

    int a = 5;

    button = new QPushButton[a];
    button->setText("Ok");

    QVBoxLayout *layout = new QVBoxLayout[a];

    for (int i = 0; i < sizeof(button)/4; i++) {
        /*here, i wanted to do something like this;     
        'layout[i].addWidget(button[i]);' but didn't work*/
        layout[i].addWidget(button);
    }
    setLayout(layout);
}

Show::~Show() {

}

的main.cpp

#include "show.h"
#include <QApplication>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    Show *dialog = new Show;
    dialog->show();

    return a.exec();
}

运行代码后,我只看到一个按钮。 非常感谢您的帮助。谢谢!!

2 个答案:

答案 0 :(得分:1)

QPushButton* pButton = new QPushButton("Ok");

这会创建QPushButton的单个实例。

您可以通过调用Layout::addWidget将该按钮添加到布局,内部调用addItem

正如addItem的文档说明: -

  

注意:项目的所有权转移到布局,布局是否有责任将其删除

因此,您当前的代码会创建一个按钮,当它被添加到每个连续的布局中时,它将从之前添加的布局中删除。

您正在创建一个按钮并添加相同的按钮5次。如果你想要5个布局中的5个按钮使用循环,那么你需要5个单独的按钮实例: -

for (int i=0; i<5; ++i) 
{
    QPushButton* pButton = new QPushButton("Ok"); 
    layout[i].addWidget(pButton);
}

答案 1 :(得分:0)

show.cpp更改行

Show::Show(QWidget *parent) : QDialog(parent) {

    int a = 5;  

    // You only need one layout for all buttons, not one per button.
    QVBoxLayout *layout = new QVBoxLayout( this );

    for (int i = 0; i < a; i++) {
        QPushButton * newButton = new QPushButton( this );
        newButton ->setText( "Ok" );
        layout->addWidget( newButton );
    }
    setLayout(layout);
}

Show::~Show() {

}

布局需要一个指针,你只需要一个布局而不是每个按钮一个。