2012-07-13 91 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); 
    } 
} 

如果你不需要一次又一次地創建和刪除新的按鈕,就可以有恆定的設定按鈕的,只是顯示和隱藏它們。