2012-07-13 52 views
1

我遇到以下问题,我一直在努力。我有一个放置在滚动区域的工具按钮列表。我想使用按钮复制工具按钮文本的第二个滚动区域,但仅适用于所选的工具按钮。例如,让我们选择工具按钮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); 
} 

头文件:

#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 

主营:

#include <QtGui/QApplication> 
#include "mainwindow.h" 

int main(int argc, char *argv[]) 
{ 
QApplication a(argc, argv); 
MainWindow w; 
w.show(); 

return a.exec(); 
} 

当我按下更新按钮一次,它的工作原理完美的,但是当我选择不同的工具按钮并再次推送更新时,好像按钮正在堆叠,就好像布局是n一样ot空了。但是,当我选择没有工具按钮并推送更新时,没有按钮,因此布局被清空。任何人都可以看到我做错了什么吗?

回答

0

的“更新”的代码示例:

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

如果你不需要一次又一次地创建和删除新的按钮,就可以有恒定的设定按钮的,只是显示和隐藏它们。