Qt 重复按钮

Qt 重复按钮,qt,layout,copy,Qt,Layout,Copy,我有以下问题一直困扰着我。我在滚动区域中有一个工具按钮列表。我想创建第二个滚动区域,其中包含复制工具按钮文本的按钮,但仅用于选定的工具按钮。例如,让我们选择工具按钮1、2和3。然后,当我按下“更新”按钮时,会出现一个带有按钮1、2和3的滚动区域。这是我的代码: CPP文件: #include "mainwindow.h" #include "ui_mainwindow.h" #include <QtGui> MainWindow::MainWindow(QWidget *paren

我有以下问题一直困扰着我。我在滚动区域中有一个工具按钮列表。我想创建第二个滚动区域,其中包含复制工具按钮文本的按钮,但仅用于选定的工具按钮。例如,让我们选择工具按钮1、2和3。然后,当我按下“更新”按钮时,会出现一个带有按钮1、2和3的滚动区域。这是我的代码:

CPP文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtGui>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

scrollArea.setParent(ui->centralWidget);
scrollArea.setGeometry(50,50,200,300);
scrollArea.setWidget(&viewport);
viewport.setLayout(&layout);

scrollArea2.setParent(ui->centralWidget);
scrollArea2.setGeometry(350,50,200,300);
scrollArea2.setWidget(&viewport2);
viewport2.setLayout(&layout2);

update.setParent(ui->centralWidget);
update.setGeometry(50,400,100,50);
update.setText("update");

addButtons();

connect(&update,SIGNAL(clicked()),this,SLOT(refreshScrollArea()));
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::addButtons()
{
for(int i=0; i<5;i++)
{
    QToolButton *button = new QToolButton;
    button->setCheckable(true);
    buttons<<button;
    buttons[i]->setText(QString::number(i+1));
    buttons[i]->setMinimumSize(200,50);
    layout.addWidget(buttons[i]);
}

viewport.resize(200,5*50);
}

void MainWindow::refreshScrollArea()
{
while (!layout2.isEmpty())
{
    delete layout2.takeAt(0);
}

int selected_index=0;

for(int i=0; i<5;i++)
{
    if (buttons[i]->isChecked())
    {
        QPushButton * button = new QPushButton;
        button->setText(buttons[i]->text());
        layout2.addWidget(button);
        selected_index++;
    }
}

viewport2.resize(150,50*selected_index);
}
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
scrollArea.setParent(ui->centralWidget);
scrollArea.setGeometry(50,50200300);
scrollArea.setWidget(&viewport);
viewport.setLayout(&layout);
scrollArea2.setParent(ui->centralWidget);
滚动区域2.设置几何体(350,50200300);
scrollArea2.setWidget(&viewport2);
viewport2.setLayout(&layout2);
update.setParent(ui->centralWidget);
更新setGeometry(50400100,50);
update.setText(“更新”);
添加按钮();
连接(&更新,信号(单击()),此,插槽(刷新滚动区域());
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void主窗口::addButtons()
{
for(int i=0;isetCheckable(true);
按钮设置最小尺寸(200,50);
layout.addWidget(按钮[i]);
}
视口。调整大小(200,5*50);
}
void MainWindow::refreshScrollArea()
{
而(!layout2.isEmpty())
{
删除布局2.takeAt(0);
}
选定的int_索引=0;
对于(int i=0;iisChecked())
{
QPushButton*按钮=新的QPushButton;
按钮->设置文本(按钮[i]->text());
layout2.addWidget(按钮);
选定的_索引++;
}
}
viewport2.调整大小(150,50*选定的索引);
}
头文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtGui>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

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

private slots:

void addButtons();
void refreshScrollArea();

private:
Ui::MainWindow *ui;

QVector<QToolButton*> buttons;

QScrollArea scrollArea;
QScrollArea scrollArea2;

QVBoxLayout layout;
QVBoxLayout layout2;

QWidget viewport;
QWidget viewport2;

QPushButton update;
};

#endif // MAINWINDOW_H
\ifndef主窗口
#定义主窗口
#包括
#包括
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
专用插槽:
void addButtons();
无效区域();
私人:
Ui::MainWindow*Ui;
QVector按钮;
QScrollara区域;
QScrollArea区域2;
QVBox布局;
QVBoxLayout布局2;
QWidget视口;
QWidget视口2;
QPushButton更新;
};
#endif//main窗口
主要内容:

#包括
#包括“mainwindow.h”
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
主窗口w;
w、 show();
返回a.exec();
}

当我按下一次更新按钮时,它工作得很好,但当我选择不同的工具按钮并再次按下更新按钮时,按钮似乎被堆叠起来,好像布局不是空的。但是当我选择“无工具按钮”并按下更新按钮时,没有按钮,因此布局是空的。有人能看到我做错了什么吗?

考试“更新”代码的示例:

// you clear your duplicate layout
int num = layout2->count();
for (int i = 0; i < num; ++i
{
    delete layout2->itemAt(0);
}

// you create duplicate buttons for checked initial buttons
for (int i = 0; layout1->count(); ++i)
{
   QPushButton* btn = (QPushButton*)layout1->itemAt(i);
   if (btn->isChecked())
   {
        QPushButton* newBtn = new QPushButton;
        newBtn->setText(btn->text());
        layout2->addWidget(newBtn);
    }
}
//清除重复的布局
int num=layout2->count();
对于(int i=0;iitemAt(0);
}
//为选中的初始按钮创建重复按钮
对于(int i=0;layout1->count();++i)
{
QPushButton*btn=(QPushButton*)布局1->itemAt(i);
如果(btn->isChecked())
{
QPushButton*newBtn=新的QPushButton;
newBtn->setText(btn->text());
布局2->addWidget(newBtn);
}
}
如果您不需要一次又一次地创建和删除新按钮,您可以拥有固定的按钮集,只需显示和隐藏它们

// you clear your duplicate layout
int num = layout2->count();
for (int i = 0; i < num; ++i
{
    delete layout2->itemAt(0);
}

// you create duplicate buttons for checked initial buttons
for (int i = 0; layout1->count(); ++i)
{
   QPushButton* btn = (QPushButton*)layout1->itemAt(i);
   if (btn->isChecked())
   {
        QPushButton* newBtn = new QPushButton;
        newBtn->setText(btn->text());
        layout2->addWidget(newBtn);
    }
}