轉載:LeeHDsniper
實例效果如下圖:
如上圖,堆棧窗口左半部分是一個QListWidget對象,右半部分是分別是三個標簽。通過點擊左邊不同的項目,可以使得右邊的Lable進行切換。
具體的結構是這樣:
首先這個大的窗口是一個QDialog的派生,這個大窗口包含三個子對象:
- 一個QHBoxLayout布局對象,它將窗口分為左右兩部分
- 一個QListWidget對象,包含三個Item
- 一個QStackedWidget對象,包含了三個標簽對象
代碼如下:
stackdlg.h,定義了各個元素
1 #ifndef STACKDLG_H 2 #define STACKDLG_H 3 4 #include <QDialog> 5 #include <QListWidget> 6 #include <QStackedWidget> 7 #include <QLabel> 8 class StackDlg : public QDialog 9 { 10 Q_OBJECT 11 12 public: 13 StackDlg(QWidget *parent = 0); 14 ~StackDlg(); 15 private: 16 QListWidget *list; 17 QStackedWidget *stack; 18 QLabel *lable1; 19 QLabel *lable2; 20 QLabel *lable3; 21 }; 22 23 #endif // STACKDLG_H
stackdlg.cpp 具體實現
1 #include "stackdlg.h" 2 #include <QHBoxLayout> 3 StackDlg::StackDlg(QWidget *parent) 4 : QDialog(parent) 5 { 6 setWindowTitle(tr("StackedWidget")); 7 list=new QListWidget(this); //新建一個QListWidget控件對象 8 list->insertItem(0,tr("Window1"));//在QListWidget中插入三個條目作為選擇項 9 list->insertItem(1,tr("Window2")); 10 list->insertItem(2,tr("Window3")); 11 //創建三個QLable標簽控件對象,作為堆棧窗口需要顯示的三層窗體 12 lable1=new QLabel(tr("WindowTest1")); 13 lable2=new QLabel(tr("WindowTest2")); 14 lable3=new QLabel(tr("WindowTest3")); 15 stack=new QStackedWidget(this);//新建一個QStackedWidget堆棧窗體對象 16 //將三個QLable標簽控件依次插入堆棧窗體中 17 stack->addWidget(lable1); 18 stack->addWidget(lable2); 19 stack->addWidget(lable3); 20 QHBoxLayout *mainlayout=new QHBoxLayout(this); 21 mainlayout->setMargin(5); 22 mainlayout->setSpacing(5); 23 mainlayout->addWidget(list); 24 mainlayout->addWidget(stack,0,Qt::AlignHCenter); 25 mainlayout->setStretchFactor(list,1); 26 mainlayout->setStretchFactor(stack,3); 27 connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int))); 28 } 29 30 StackDlg::~StackDlg() 31 { 32 33 }
main.cpp如下:
1 #include "stackdlg.h" 2 #include <QApplication> 3 4 int main(int argc, char *argv[]) 5 { 6 QApplication app(argc, argv); 7 Dialog w; 8 w.show(); 9 10 return app.exec(); 11 }
重要代碼
這個里面的重要代碼有兩個:
1. mainlayout->setStretchFactor(list,1);
mainlayout->setStretchFactor(stack,3);
這個我在前面的文章中已經講過:
http://blog.csdn.net/leehdsniper/article/details/51005149,這里對list和stack的參數為1和3,區別就在於拉伸時的變化率的大小。
2. connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));
這個連接函數將QListWidget的信號currentRowChange(int)和QStackedWidget的槽setCurrentIndex(int)連接在一起,所以才導致了堆棧窗口的切換。