由于QDockWidget只是提供一个可停靠的地方,接受一个QWidget*类型的形参,如果要添加已有的控件,只要是继承自QWidget的都可添加,如果要添加自定义的控件,应该新建一个类以继承自QWidget然后在该类中设计要添加的控件和布局。该类设计完成后应该作为一个整体当做实参传给addDockWidget即可实现添加自定义窗口为停靠窗口。
Example: 此例子主要以实现一个简单工具箱的布局为目的
//创建一个类继承自QWidget,此处类名为 CToolkit
//头文件内容如下:
#ifndef TOOLKIT_H #define TOOLKIT_H #include <QWidget> #include <QLabel> #include <QPushButton> #include <QButtonGroup> #include <QSize> class CToolkit : public QWidget { Q_OBJECT public: explicit CToolkit(QWidget *parent = 0); ~CToolkit(); signals: public slots: private: //basic buttons QPushButton * basPotBtn; //draw pointer QPushButton * basLineBtn; //draw line QPushButton * basPolygonaLineBtn; //draw polygon line QPushButton * basArcBtn; //draw arc QPushButton * basCurveBtn; //draw curve QPushButton * basBasselCurveBtn; //draw bassel curve QPushButton * basRectangleBtn; //draw rectangle QPushButton * basRoundRectBtn; //draw round rectangle QPushButton * basCircleBtn; //draw circle QPushButton * basSectorBtn; //draw sector QPushButton * basHalfCirBtn; //draw half circle QPushButton * basPolygonBtn; //draw polygon QPushButton * basEnclosedCurBtn; //draw closed curve QPushButton * basEnclosedBasselCurBtn; //draw closed bassel curve QPushButton * basTextBtn; //draw text QPushButton * basPumpBtn; //draw pump //extension buttons QPushButton *extPotBtn; //draw point QPushButton *extBtnBtn; //draw button QPushButton *extPicBtn; //draw picture QPushButton *extTreLineBtn; //draw trend line QPushButton *extAlaWndBtn; //draw alarm window QPushButton *extXYTreBtn; //draw XY trend QPushButton *extEveWndBtn; //draw event window QPushButton *extVerRuleBtn; //draw vertical ruler QPushButton *extHorRuleBtn; //draw horizontal ruler QPushButton *extBarPicBtn; //draw bar picture QPushButton *extMenuBtn; //draw menu QPushButton *extRepBtn; //draw report //UI buttons QPushButton *UIPotBtn; //draw point QPushButton *UIBtnBtn; //draw button QPushButton *UICheBtn; //draw checkbox QPushButton *UITextBtn; //draw textedit QPushButton *UIComBtn; //draw combobox QPushButton *UILstBtn; //draw listbox QPushButton *UISigBtn; //draw siglebox QPushButton *UITreeBtn; //draw treeview QPushButton *UICalBtn; //draw calender QPushButton *UIMulTextBtn; //draw multify textedit QPushButton *UIDateBtn; //draw datetime QPushButton *UIRelBtn; //draw relative datetime QPushButton *MulTreeBtn; //draw multify treeview private: QWidget *m_pBasWidget; QWidget *m_pExtWidget; QWidget *m_pUIWidget; private: QButtonGroup *m_pBasGropBox; QButtonGroup *m_pExtGropBox; QButtonGroup *m_pUIGropBox; public slots: int basicGroupBoxClicked(int); int extensionGroupBoxClicked(int); int UIGroupBoxClicked(int); public: int drawType; //1 indicate basic type, 2 indicate extension type, 3 indicate UI type private: void createBasicBtns(); void createUIBtns(); void createExtensionBtns(); }; #endif // TOOLKIT_H
//实现文件内容如下:
#include "toolkit.h" #include <QLabel> #include <QPushButton> #include <QGridLayout> #include <QToolBox> CToolkit::CToolkit(QWidget *parent) : QWidget(parent) { createBasicBtns(); createExtensionBtns(); createUIBtns(); drawType = 0; QVBoxLayout *mainLayout = new QVBoxLayout; QToolBox * toolbox = new QToolBox; toolbox->addItem(m_pBasWidget, tr("基本")); toolbox->addItem(m_pExtWidget, tr("扩展")); toolbox->addItem(m_pUIWidget, tr("UI")); mainLayout->addWidget(toolbox); this->setLayout(mainLayout); this->setMaximumWidth(180); } CToolkit::~CToolkit() { //basic buttons delete basPotBtn; //draw pointer delete basLineBtn; //draw line delete basPolygonaLineBtn; //draw polygon line delete basArcBtn; //draw arc delete basCurveBtn; //draw curve delete basBasselCurveBtn; //draw bassel curve delete basRectangleBtn; //draw rectangle delete basRoundRectBtn; //draw round rectangle delete basCircleBtn; //draw circle delete basSectorBtn; //draw sector delete basHalfCirBtn; //draw half circle delete basPolygonBtn; //draw polygon delete basEnclosedCurBtn; //draw closed curve delete basEnclosedBasselCurBtn; //draw closed bassel curve delete basTextBtn; //draw text delete basPumpBtn; //draw pump //extension buttons delete extPotBtn; //draw point delete extBtnBtn; //draw button delete extPicBtn; //draw picture delete extTreLineBtn; //draw trend line delete extAlaWndBtn; //draw alarm window delete extXYTreBtn; //draw XY trend delete extEveWndBtn; //draw event window delete extVerRuleBtn; //draw vertical ruler delete extHorRuleBtn; //draw horizontal ruler delete extBarPicBtn; //draw bar picture delete extMenuBtn; //draw menu delete extRepBtn; //draw report //UI buttons delete UIPotBtn; //draw point delete UIBtnBtn; //draw button delete UICheBtn; //draw checkbox delete UITextBtn; //draw textedit delete UIComBtn; //draw combobox delete UILstBtn; //draw listbox delete UISigBtn; //draw siglebox delete UITreeBtn; //draw treeview delete UICalBtn; //draw calender delete UIMulTextBtn; //draw multify textedit delete UIDateBtn; //draw datetime delete UIRelBtn; //draw relative datetime delete MulTreeBtn; //draw multify treeview delete m_pBasWidget; delete m_pExtWidget; delete m_pUIWidget; } void CToolkit::createBasicBtns() { m_pBasGropBox = new QButtonGroup; if(NULL == m_pBasGropBox) { return; } connect(m_pBasGropBox, SIGNAL(buttonClicked(int)), this, SLOT(basicGroupBoxClicked(int))); m_pBasWidget = new QWidget(); if(NULL == m_pBasWidget) { return; } //draw pointer basPotBtn = new QPushButton(QIcon(tr(":/res/ctrl/BasicCtrl/choice.ico")), tr(""), this); basPotBtn->resize(16, 16); basPotBtn->setToolTip(tr("指针")); //draw line basLineBtn = new QPushButton(QIcon(tr(":/res/ctrl/BasicCtrl/line.ico")), tr(""), this); basLineBtn->resize(16, 16); basLineBtn->setToolTip(tr("直线")); //draw polygon line basPolygonaLineBtn = new QPushButton(QIcon(tr(":/res/ctrl/BasicCtrl/polygonalline.ico")), tr(""), this); basPolygonaLineBtn->resize(16, 16); basPolygonaLineBtn->setToolTip(tr("折线")); //draw arc basArcBtn = new QPushButton(QIcon(tr(":/res/ctrl/BasicCtrl/arc.ico")), tr(""), this); basArcBtn->resize(16, 16); basArcBtn->setToolTip(tr("弧线")); //draw curve basCurveBtn = new QPushButton(QIcon(tr(":/res/ctrl/BasicCtrl/curve.ico")), tr(""), this); basCurveBtn->resize(16, 16); basCurveBtn->setToolTip(tr("曲线")); //draw bassel curve basBasselCurveBtn = new QPushButton(QIcon(tr(":/res/ctrl/BasicCtrl/Besselcurve.ico")), tr(""), this); basBasselCurveBtn->resize(16, 16); basBasselCurveBtn->setToolTip(tr("贝塞尔曲线")); //draw rectangle basRectangleBtn = new QPushButton(QIcon(tr(":/res/ctrl/BasicCtrl/rectangle.ico")), tr(""), this); basRectangleBtn->resize(16, 16); basRectangleBtn->setToolTip(tr("矩形")); //draw round rectangle basRoundRectBtn = new QPushButton(QIcon(tr(":/res/ctrl/BasicCtrl/Roundedrectangle.ico")), tr(""), this); basRoundRectBtn->resize(16, 16); basRoundRectBtn->setToolTip(tr("圆角矩形")); //draw circle basCircleBtn = new QPushButton(QIcon(tr(":/res/ctrl/BasicCtrl/circle.ico")), tr(""), this); basCircleBtn->resize(16, 16); basCircleBtn->setToolTip(tr("椭圆")); //draw sector basSectorBtn = new QPushButton(QIcon(tr(":/res/ctrl/BasicCtrl/sector.ico")), tr(""), this); basSectorBtn->resize(16, 16); basSectorBtn->setToolTip(tr("扇形")); //draw half circle basHalfCirBtn = new QPushButton(QIcon(tr(":/res/ctrl/BasicCtrl/halfcircle.ico")), tr(""), this); basHalfCirBtn->resize(16, 16); basHalfCirBtn->setToolTip(tr("弦")); //draw polygon basPolygonBtn = new QPushButton(QIcon(tr(":/res/ctrl/BasicCtrl/polygon.ico")), tr(""), this); basPolygonBtn->resize(16, 16); basPolygonBtn->setToolTip(tr("多边形")); //draw closed cur basEnclosedCurBtn = new QPushButton(QIcon(tr(":/res/ctrl/BasicCtrl/enclosedcircle.ico")), tr(""), this); basEnclosedCurBtn->resize(16, 16); basEnclosedCurBtn->setToolTip(tr("封闭曲线")); //draw close bassel curve basEnclosedBasselCurBtn = new QPushButton(QIcon(tr(":/res/ctrl/BasicCtrl/enclosedbasselcurve.ico")), tr(""), this); basEnclosedBasselCurBtn->resize(16, 16); basEnclosedBasselCurBtn->setToolTip(tr("封闭贝塞尔曲线")); //draw text basTextBtn = new QPushButton(QIcon(tr(":/res/ctrl/BasicCtrl/text.ico")), tr(""), this); basTextBtn->resize(16, 16); basTextBtn->setToolTip(tr("文本")); //draw pump basPumpBtn = new QPushButton(QIcon(tr(":/res/ctrl/BasicCtrl/pump.ico")), tr(""), this); basPumpBtn->resize(16, 16); basPumpBtn->setToolTip(tr("管道")); QGridLayout *basicLayout = new QGridLayout(); basicLayout->addWidget(basPotBtn, 0, 0); basicLayout->addWidget(basLineBtn, 0, 1); basicLayout->addWidget(basPolygonaLineBtn, 0, 2); basicLayout->addWidget(basArcBtn, 0, 3); basicLayout->addWidget(basCurveBtn, 1, 0); basicLayout->addWidget(basBasselCurveBtn, 1, 1); basicLayout->addWidget(basRectangleBtn, 1, 2); basicLayout->addWidget(basRoundRectBtn, 1, 3); basicLayout->addWidget(basCircleBtn, 2, 0); basicLayout->addWidget(basSectorBtn, 2, 1); basicLayout->addWidget(basHalfCirBtn, 2, 2); basicLayout->addWidget(basPolygonBtn, 2, 3); basicLayout->addWidget(basEnclosedCurBtn, 3, 0); basicLayout->addWidget(basEnclosedBasselCurBtn, 3, 1); basicLayout->addWidget(basTextBtn, 3, 2); basicLayout->addWidget(basPumpBtn, 3, 3); m_pBasGropBox->addButton(basPotBtn); m_pBasGropBox->addButton(basLineBtn); m_pBasGropBox->addButton(basPolygonaLineBtn); m_pBasGropBox->addButton(basArcBtn); m_pBasGropBox->addButton(basCurveBtn); m_pBasGropBox->addButton(basBasselCurveBtn); m_pBasGropBox->addButton(basRectangleBtn); m_pBasGropBox->addButton(basRoundRectBtn); m_pBasGropBox->addButton(basCircleBtn); m_pBasGropBox->addButton(basSectorBtn); m_pBasGropBox->addButton(basHalfCirBtn); m_pBasGropBox->addButton(basPolygonBtn); m_pBasGropBox->addButton(basEnclosedCurBtn); m_pBasGropBox->addButton(basEnclosedBasselCurBtn); m_pBasGropBox->addButton(basTextBtn); m_pBasGropBox->addButton(basPumpBtn); m_pBasWidget->setLayout(basicLayout); } void CToolkit::createUIBtns() { m_pUIGropBox = new QButtonGroup; if(NULL == m_pUIGropBox) { return; } connect(m_pUIGropBox, SIGNAL(buttonClicked(int)), this, SLOT(UIGroupBoxClicked(int))); m_pUIWidget = new QWidget(); if(NULL == m_pUIWidget) { return; } //draw pointer UIPotBtn = new QPushButton(QIcon(tr(":/res/ctrl/UICtrl/choice.ico")), tr(""), this); UIPotBtn->resize(16, 16); UIPotBtn->setToolTip(tr("指针")); //draw button UIBtnBtn = new QPushButton(QIcon(tr(":/res/ctrl/UICtrl/button.ico")), tr(""), this); UIBtnBtn->resize(16, 16); UIBtnBtn->setToolTip(tr("按钮")); //draw checkbox UICheBtn = new QPushButton(QIcon(tr(":/res/ctrl/UICtrl/checkbox.ico")), tr(""), this); UICheBtn->resize(16, 16); UICheBtn->setToolTip(tr("复选框")); //draw textedit UITextBtn = new QPushButton(QIcon(tr(":/res/ctrl/UICtrl/textedit.ico")), tr(""), this); UITextBtn->resize(16, 16); UITextBtn->setToolTip(tr("文本框")); //draw combobox UIComBtn = new QPushButton(QIcon(tr(":res/ctrl/UICtrl/combobox.ico")), tr(""), this); UIComBtn->resize(16, 16); UIComBtn->setToolTip(tr("复选框")); //draw listbox UILstBtn = new QPushButton(QIcon(tr(":/res/ctrl/UICtrl/listbox.ico")), tr(""), this); UILstBtn->resize(16, 16); UILstBtn->setToolTip(tr("列表框")); //draw singlebox UISigBtn = new QPushButton(QIcon(tr(":/res/ctrl/UICtrl/singlebox.ico")), tr(""), this); UISigBtn->resize(16, 16); UISigBtn->setToolTip(tr("单选框")); //draw treeview UITreeBtn = new QPushButton(QIcon(tr(":/res/ctrl/UICtrl/treeview.ico")), tr(""), this); UITreeBtn->resize(16, 16); UITreeBtn->setToolTip(tr("树视图")); //draw calender UICalBtn = new QPushButton(QIcon(tr(":/res/ctrl/UICtrl/calender.ico")), tr(""), this); UICalBtn->resize(16, 16); UICalBtn->setToolTip(tr("日历")); //draw mulify textedit UIMulTextBtn = new QPushButton(QIcon(tr(":/res/ctrl/UICtrl/mulitfunctionaltextedit.ico")), tr(""), this); UIMulTextBtn->resize(16, 16); UIMulTextBtn->setToolTip(tr("复杂文本框")); //draw datetime UIDateBtn = new QPushButton(QIcon(tr(":/res/ctrl/UICtrl/dateandtime.ico")), tr(""), this); UIDateBtn->resize(16, 16); UIDateBtn->setToolTip(tr("日期时间")); //draw relative datatime UIRelBtn = new QPushButton(QIcon(tr(":/res/ctrl/UICtrl/relativedateandtime.ico")), tr(""), this); UIRelBtn->resize(16, 16); UIRelBtn->setToolTip(tr("相对时间")); //draw mulify treeview MulTreeBtn = new QPushButton(QIcon(tr(":/res/ctrl/UICtrl/multifunctionaltreeview.ico")), tr(""), this); MulTreeBtn->resize(16, 16); MulTreeBtn->setToolTip(tr("多功能树视图")); QGridLayout *UILayout = new QGridLayout(); UILayout->addWidget(UIPotBtn, 0, 0); UILayout->addWidget(UIBtnBtn, 0, 1); UILayout->addWidget(UICheBtn, 0, 2); UILayout->addWidget(UITextBtn, 0, 3); UILayout->addWidget(UIComBtn, 1, 0); UILayout->addWidget(UILstBtn, 1, 1); UILayout->addWidget(UISigBtn, 1, 2); UILayout->addWidget(UITreeBtn, 1, 3); UILayout->addWidget(UICalBtn, 2, 0); UILayout->addWidget(UIMulTextBtn, 2, 1); UILayout->addWidget(UIDateBtn, 2, 2); UILayout->addWidget(UIRelBtn, 2, 3); UILayout->addWidget(MulTreeBtn, 3, 0); m_pUIGropBox->addButton(UIPotBtn); m_pUIGropBox->addButton(UIBtnBtn); m_pUIGropBox->addButton(UICheBtn); m_pUIGropBox->addButton(UITextBtn); m_pUIGropBox->addButton(UIComBtn); m_pUIGropBox->addButton(UILstBtn); m_pUIGropBox->addButton(UISigBtn); m_pUIGropBox->addButton(UITreeBtn); m_pUIGropBox->addButton(UICalBtn); m_pUIGropBox->addButton(UIMulTextBtn); m_pUIGropBox->addButton(UIDateBtn); m_pUIGropBox->addButton(UIRelBtn); m_pUIGropBox->addButton(MulTreeBtn); m_pUIWidget->setLayout(UILayout); //this->setLayout(UILayout); } void CToolkit::createExtensionBtns() { m_pExtGropBox = new QButtonGroup; if(NULL == m_pExtGropBox) { return; } connect(m_pExtGropBox, SIGNAL(buttonClicked(int)), this, SLOT(extensionGroupBoxClicked(int))); m_pExtWidget = new QWidget(); if(NULL == m_pExtWidget) { return; } //draw pointer extPotBtn = new QPushButton(QIcon(tr(":/res/ctrl/ExtCtrl/choice.ico")), tr(""), this); extPotBtn->resize(16, 16); extPotBtn->setToolTip(tr("指针")); //draw button extBtnBtn = new QPushButton(QIcon(tr(":/res/ctrl/ExtCtrl/button.ico")), tr(""), this); extBtnBtn->resize(16, 16); extBtnBtn->setToolTip(tr("按钮")); //draw picture extPicBtn = new QPushButton(QIcon(tr(":/res/ctrl/ExtCtrl/picturecontrol.ico")), tr(""), this); extPicBtn->resize(16, 16); extPicBtn->setToolTip(tr("图像")); //draw trend line extTreLineBtn = new QPushButton(QIcon(tr(":/res/ctrl/ExtCtrl/trendline.ico")), tr(""), this); extTreLineBtn->resize(16, 16); extTreLineBtn->setToolTip(tr("趋势曲线")); //draw alarm window extAlaWndBtn = new QPushButton(QIcon(tr(":res/ctrl/ExtCtrl/alarmwindow.ico")), tr(""), this); extAlaWndBtn->resize(16, 16); extAlaWndBtn->setToolTip(tr("报警窗")); //draw XY trend extXYTreBtn = new QPushButton(QIcon(tr(":/res/ctrl/ExtCtrl/XYtrendline.ico")), tr(""), this); extXYTreBtn->resize(16, 16); extXYTreBtn->setToolTip(tr("XY曲线")); //draw event window extEveWndBtn = new QPushButton(QIcon(tr(":/res/ctrl/ExtCtrl/eventwindow.ico")), tr(""), this); extEveWndBtn->resize(16, 16); extEveWndBtn->setToolTip(tr("事件窗")); //draw vertical ruler extVerRuleBtn = new QPushButton(QIcon(tr(":/res/ctrl/ExtCtrl/verticaldivilingrule.ico")), tr(""), this); extVerRuleBtn->resize(16, 16); extVerRuleBtn->setToolTip(tr("垂直标尺")); //draw horizontal ruler extHorRuleBtn = new QPushButton(QIcon(tr(":/res/ctrl/ExtCtrl/horizontaldivilingrule.ico")), tr(""), this); extHorRuleBtn->resize(16, 16); extHorRuleBtn->setToolTip(tr("水平标尺")); //draw bar picture extBarPicBtn = new QPushButton(QIcon(tr(":/res/ctrl/ExtCtrl/report.ico")), tr(""), this); extBarPicBtn->resize(16, 16); extBarPicBtn->setToolTip(tr("棒图")); //draw relative datatime extRepBtn = new QPushButton(QIcon(tr(":/res/ctrl/ExtCtrl/barpicture.ico")), tr(""), this); extRepBtn->resize(16, 16); extRepBtn->setToolTip(tr("报表")); //draw menu extMenuBtn = new QPushButton(QIcon(tr(":/res/ctrl/ExtCtrl/menu.ico")), tr(""), this); extMenuBtn->resize(16, 16); extMenuBtn->setToolTip(tr("菜单")); QGridLayout *extLayout = new QGridLayout(); extLayout->addWidget(extPotBtn, 0, 0); extLayout->addWidget(extBtnBtn, 0, 1); extLayout->addWidget(extPicBtn, 0, 2); extLayout->addWidget(extTreLineBtn, 0, 3); extLayout->addWidget(extAlaWndBtn, 1, 0); extLayout->addWidget(extXYTreBtn, 1, 1); extLayout->addWidget(extEveWndBtn, 1, 2); extLayout->addWidget(extVerRuleBtn, 1, 3); extLayout->addWidget(extHorRuleBtn, 2, 0); extLayout->addWidget(extRepBtn, 2, 1); extLayout->addWidget(extBarPicBtn, 2, 2); extLayout->addWidget(extMenuBtn, 2, 3); m_pExtGropBox->addButton(extPotBtn); m_pExtGropBox->addButton(extBtnBtn); m_pExtGropBox->addButton(extPicBtn); m_pExtGropBox->addButton(extTreLineBtn); m_pExtGropBox->addButton(extAlaWndBtn); m_pExtGropBox->addButton(extXYTreBtn); m_pExtGropBox->addButton(extEveWndBtn); m_pExtGropBox->addButton(extVerRuleBtn); m_pExtGropBox->addButton(extHorRuleBtn); m_pExtGropBox->addButton(extRepBtn); m_pExtGropBox->addButton(extBarPicBtn); m_pExtGropBox->addButton(extMenuBtn); m_pExtWidget->setLayout(extLayout); //this->setLayout(UILayout); } int CToolkit::basicGroupBoxClicked(int id) { drawType = 1; QList<QAbstractButton *> buttons = m_pBasGropBox->buttons(); foreach (QAbstractButton *button, buttons) { if (m_pBasGropBox->button(id) != button) button->setChecked(false); else { return id; } } return 0; } int CToolkit::extensionGroupBoxClicked(int id) { drawType = 2; QList<QAbstractButton *> buttons = m_pExtGropBox->buttons(); foreach (QAbstractButton *button, buttons) { if (m_pExtGropBox->button(id) != button) button->setChecked(false); else { return id; } } return 0; } int CToolkit::UIGroupBoxClicked(int id) { drawType = 3; QList<QAbstractButton *> buttons = m_pUIGropBox->buttons(); foreach (QAbstractButton *button, buttons) { if (m_pUIGropBox->button(id) != button) button->setChecked(false); else { return id; } } return 0; }
//在main.cpp中即可实现停靠窗口
#include "mainwindow.h" #include "toolkit.h" #include <QApplication> #include <QDockWidget> #include <QTextEdit> int main(int argc, char *argv[]) { QApplication a(argc, argv); QMainWindow *mainWnd = new QMainWindow; QTextEdit *txtEdit = new QTextEdit; mainWnd->setCentralWidget(txtEdit); CToolkit *pToolkit = new CToolkit; if(NULL == pToolkit) { return 1; } QDockWidget *toolkitDock = new QDockWidget(); if(NULL == toolkitDock) { return 1; } toolkitDock->setWindowTitle("工具箱"); toolkitDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); toolkitDock->setWidget(pToolkit); mainWnd->addDockWidget(Qt::LeftDockWidgetArea, toolkitDock); mainWnd->show(); return a.exec(); }