QT不规则窗体图形(代码+详解)

来源:互联网 发布:数据流程图的组成要素 编辑:程序博客网 时间:2024/05/17 07:57

窗体可以设置为图片的形状

如下:


其实就是将窗体设置一个遮罩,此遮罩设为图片的遮罩即可

这里还涉及到一些Event的函数重载,具体看代码。

头文件:

[cpp] view plaincopyprint?
  1. #include <QtGui/QWidget>   
  2. #include <QLabel>   
  3. #include <QPixmap>   
  4. class Widget : public QWidget  
  5. {  
  6.     Q_OBJECT  
  7.   
  8. public:  
  9.     Widget(QWidget *parent = 0);  
  10.     ~Widget();  
  11. protected:  
  12. //这里的三个函数都是重载函数,可以响应响应的事件   
  13.     void mousePressEvent(QMouseEvent *);  
  14.     void mouseMoveEvent(QMouseEvent *);  
  15.     void paintEvent(QPaintEvent *);//这个在窗口需要重绘的时候自动调用  
  16. private slots:  
  17.     void showtime();  
  18. private:  
  19.     QPoint dragPosition;  
  20.     QLabel *l;  
  21.         QPixmap pix;  
  22. };  
[cpp] view plaincopyprint?
  1. #include <QtGui/QWidget>   
  2. #include <QLabel>   
  3. #include <QPixmap>   
  4. class Widget : public QWidget  
  5. {  
  6.     Q_OBJECT  
  7.   
  8. public:  
  9.     Widget(QWidget *parent = 0);  
  10.     ~Widget();  
  11. protected:  
  12. //这里的三个函数都是重载函数,可以响应响应的事件   
  13.     void mousePressEvent(QMouseEvent *);  
  14.     void mouseMoveEvent(QMouseEvent *);  
  15.     void paintEvent(QPaintEvent *);//这个在窗口需要重绘的时候自动调用  
  16. private slots:  
  17.     void showtime();  
  18. private:  
  19.     QPoint dragPosition;  
  20.     QLabel *l;  
  21.         QPixmap pix;  
  22. };  

源文件:

[cpp] view plaincopyprint?
  1. #include "widget.h"   
  2. #include <QMouseEvent>   
  3. #include <QPainter>   
  4. #include <QBitmap>   
  5. #include <QGridLayout>   
  6. #include <QTimer>   
  7. #include <QTime>   
  8. Widget::Widget(QWidget *parent)  
  9.     : QWidget(parent)  
  10. {  
  11.     setWindowFlags(Qt::FramelessWindowHint);  
  12.     QPalette p=palette();  
  13.     p.setColor(QPalette::WindowText,Qt::green);  
  14.     setPalette(p);  
  15.   
  16.     l=new QLabel;  
  17.     QTime time=QTime::currentTime();  
  18.     QGridLayout *mainLayout=new QGridLayout(this);  
  19.     mainLayout->addWidget(l,0,0,Qt::AlignHCenter);  
  20.   
  21.     pix.load("qq.png",0,Qt::AvoidDither|Qt::ThresholdDither|Qt::ThresholdAlphaDither);  
  22.     resize(pix.size());  
  23.     setMask(QBitmap(pix.mask()));  
  24.   
  25.     QTimer *timer=new QTimer;  
  26.     connect(timer,SIGNAL(timeout()),this,SLOT(showtime()));  
  27.     timer->start(10);  
  28. }  
  29.   
  30. Widget::~Widget()  
  31. {  
  32.   
  33. }  
  34.   
  35. void Widget::showtime()  
  36. {  
  37.     QTime time=QTime::currentTime();  
  38.     l->setText(time.toString("A hh:mm:ss"));  
  39. }  
  40.   
  41. void Widget::mousePressEvent(QMouseEvent *event)  
  42. {  
  43.     if(event->button()==Qt::LeftButton)  
  44.     {  
  45.         dragPosition=event->globalPos()-frameGeometry().topLeft();  
  46.         event->accept();  
  47.     }  
  48.     else if(event->button()==Qt::RightButton)  
  49.     {  
  50.         close();  
  51.     }  
  52. }  
  53.   
  54. void Widget::mouseMoveEvent(QMouseEvent *event)  
  55. {  
  56.     move(event->globalPos()-dragPosition);  
  57.     event->accept();  
  58. }  
  59.   
  60. void Widget::paintEvent(QPaintEvent *event)  
  61. {  
  62.     QPainter painter(this);  
  63.     painter.drawPixmap(0,0,QPixmap("qq.png"));  
  64. }  
[cpp] view plaincopyprint?
  1. #include "widget.h"   
  2. #include <QMouseEvent>   
  3. #include <QPainter>   
  4. #include <QBitmap>   
  5. #include <QGridLayout>   
  6. #include <QTimer>   
  7. #include <QTime>   
  8. Widget::Widget(QWidget *parent)  
  9.     : QWidget(parent)  
  10. {  
  11.     setWindowFlags(Qt::FramelessWindowHint);  
  12.     QPalette p=palette();  
  13.     p.setColor(QPalette::WindowText,Qt::green);  
  14.     setPalette(p);  
  15.   
  16.     l=new QLabel;  
  17.     QTime time=QTime::currentTime();  
  18.     QGridLayout *mainLayout=new QGridLayout(this);  
  19.     mainLayout->addWidget(l,0,0,Qt::AlignHCenter);  
  20.   
  21.     pix.load("qq.png",0,Qt::AvoidDither|Qt::ThresholdDither|Qt::ThresholdAlphaDither);  
  22.     resize(pix.size());  
  23.     setMask(QBitmap(pix.mask()));  
  24.   
  25.     QTimer *timer=new QTimer;  
  26.     connect(timer,SIGNAL(timeout()),this,SLOT(showtime()));  
  27.     timer->start(10);  
  28. }  
  29.   
  30. Widget::~Widget()  
  31. {  
  32.   
  33. }  
  34.   
  35. void Widget::showtime()  
  36. {  
  37.     QTime time=QTime::currentTime();  
  38.     l->setText(time.toString("A hh:mm:ss"));  
  39. }  
  40.   
  41. void Widget::mousePressEvent(QMouseEvent *event)  
  42. {  
  43.     if(event->button()==Qt::LeftButton)  
  44.     {  
  45.         dragPosition=event->globalPos()-frameGeometry().topLeft();  
  46.         event->accept();  
  47.     }  
  48.     else if(event->button()==Qt::RightButton)  
  49.     {  
  50.         close();  
  51.     }  
  52. }  
  53.   
  54. void Widget::mouseMoveEvent(QMouseEvent *event)  
  55. {  
  56.     move(event->globalPos()-dragPosition);  
  57.     event->accept();  
  58. }  
  59.   
  60. void Widget::paintEvent(QPaintEvent *event)  
  61. {  
  62.     QPainter painter(this);  
  63.     painter.drawPixmap(0,0,QPixmap("qq.png"));  
  64. }  

下面三个函数是响应各个事件的

前面两个为了实现可拖动,时钟程序也用了

后面那个为了显示图片


可以看到,程序被拖动到了右边。

 

这些窗体都比较类似,相对简单,就没什么可以深入研究的了。


下面用代码实现上面窗口的设计:

1.建立项目时基类选择QDialog,取消Gernerate form复选框的选中状态。

2.在头文件dialog.h中编写如下代码:

[cpp] view plaincopyprint?
  1. #include <QtGui/QDialog>   
  2. #include <QListWidget>   
  3. #include <QStackedWidget>  
  4. #include <QLabel>   
  5.   
  6. class Dialog : public QDialog  
  7. {  
  8.     Q_OBJECT  
  9.   
  10. public:  
  11.     Dialog(QWidget *parent = 0);  
  12.     ~Dialog();  
  13. private:  
  14.     QListWidget *leftlist;  
  15.     QStackedWidget *stack;  
  16.     QLabel *label1;  
  17.     QLabel *label2;  
  18.     QLabel *label3;  
  19. };  
[cpp] view plaincopyprint?
  1. #include <QtGui/QDialog>   
  2. #include <QListWidget>   
  3. #include <QStackedWidget>  
  4. #include <QLabel>   
  5.   
  6. class Dialog : public QDialog  
  7. {  
  8.     Q_OBJECT  
  9.   
  10. public:  
  11.     Dialog(QWidget *parent = 0);  
  12.     ~Dialog();  
  13. private:  
  14.     QListWidget *leftlist;  
  15.     QStackedWidget *stack;  
  16.     QLabel *label1;  
  17.     QLabel *label2;  
  18.     QLabel *label3;  
  19. };  



 

3.在源文件dialog.cpp中编写如下代码:

[cpp] view plaincopyprint?
  1. #include "dialog.h"   
  2. #include <QHBoxLayout>   
  3. Dialog::Dialog(QWidget *parent)  
  4.     : QDialog(parent)  
  5. {  
  6.      setWindowTitle(tr("StackedWidget"));  
  7.      //设置列表框   
  8.      leftlist=new QListWidget(this);  
  9.      leftlist->insertItem(0,tr("window1"));  
  10.      leftlist->insertItem(1,tr("window2"));  
  11.      leftlist->insertItem(2,tr("window3"));  
  12.      //设置堆栈窗体   
  13.      label1=new QLabel(tr("WindowTest1\n\tby liming"));  
  14.      label2=new QLabel(tr("WindowTest2\n\tby liming"));  
  15.      label3=new QLabel(tr("WindowTest3\n\tby liming"));  
  16.   
  17.      stack=new QStackedWidget(this);  
  18.      stack->addWidget(label1);  
  19.      stack->addWidget(label2);  
  20.      stack->addWidget(label3);  
  21.      //设置主窗体布局   
  22.      QHBoxLayout *mainLayout=new QHBoxLayout(this);  
  23.      mainLayout->setMargin(5);  
  24.      mainLayout->setSpacing(5);  
  25.      mainLayout->addWidget(leftlist);  
  26.      mainLayout->addWidget(stack,0,Qt::AlignHCenter);  
  27.      mainLayout->setStretchFactor(leftlist,1);  
  28.      mainLayout->setStretchFactor(stack,3);  
  29.      connect(leftlist,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));  
  30. }  
[cpp] view plaincopyprint?
  1. #include "dialog.h"   
  2. #include <QHBoxLayout>   
  3. Dialog::Dialog(QWidget *parent)  
  4.     : QDialog(parent)  
  5. {  
  6.      setWindowTitle(tr("StackedWidget"));  
  7.      //设置列表框   
  8.      leftlist=new QListWidget(this);  
  9.      leftlist->insertItem(0,tr("window1"));  
  10.      leftlist->insertItem(1,tr("window2"));  
  11.      leftlist->insertItem(2,tr("window3"));  
  12.      //设置堆栈窗体   
  13.      label1=new QLabel(tr("WindowTest1\n\tby liming"));  
  14.      label2=new QLabel(tr("WindowTest2\n\tby liming"));  
  15.      label3=new QLabel(tr("WindowTest3\n\tby liming"));  
  16.   
  17.      stack=new QStackedWidget(this);  
  18.      stack->addWidget(label1);  
  19.      stack->addWidget(label2);  
  20.      stack->addWidget(label3);  
  21.      //设置主窗体布局   
  22.      QHBoxLayout *mainLayout=new QHBoxLayout(this);  
  23.      mainLayout->setMargin(5);  
  24.      mainLayout->setSpacing(5);  
  25.      mainLayout->addWidget(leftlist);  
  26.      mainLayout->addWidget(stack,0,Qt::AlignHCenter);  
  27.      mainLayout->setStretchFactor(leftlist,1);  
  28.      mainLayout->setStretchFactor(stack,3);  
  29.      connect(leftlist,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));  
  30. }  



 

解析:

1.这里的程序是,选中左边列表框内的内容,显示相应的窗体。


2.所以,第一步是初始化列表框QListWidget。


3.第二步新建堆栈窗体:

stack=new QStackedWidget(this);

然后将三个相应的label放入其中:

stack->addWidget(label1);
stack->addWidget(label2);
stack->addWidget(label3);


4.设置主窗体布局时,用到了布局管理器。这里用到的是水平排列窗体QHBoxLayout:

QHBoxLayout *mainLayout=new QHBoxLayout(this);

这个布局管理器用法为:

×对话框边距设为5

mainLayout->setMargin(5);

×内部控件间距为5

mainLayout->setSpacing(5);

×对于setStetchFactor函数,借用别的文章说明(http://blog.csdn.net/lin49940/article/details/6033727):

这里讲得是QSplitter的setStetchFactor函数:

程序为

 对于B 和 A 来说, 他们的本身的大小相对于整个窗口来说, 都是很小的. 这样就存在着一些多余的空间, 这些空间可以给B, 也可以给A, 或者两个平分. 对于B 和 A 各自空间大小的控制, 是通过 QSplitter 的 setStretchFactor 方法, 该方法的声明:

 

      void setStretchFactor(int index, int stretch);

 

      第一个参数index 是子微件的索引值, 从0 开始. 这里的话, B 是0, A 是1; 第二个参数 stretch 是拉伸系数, int 类型, 下面主要对stretch 的数值进行说明.

 

      1.  mainSplitter->setStretchFactor(0, -2);

      效果如下,

      

      B占据了所有多余的空间, 看来 stretch 的值如果为负整数, 那这个微件将占据最大的空间.

 

      2.     mainSplitter->setStretchFactor(0, -2);
              mainSplitter->setStretchFactor(1, -4);

      效果如下:

      

 

      B 和 A 平分了空间, 看来stretch 如果是负整数就会尽可能的占据空间, 而不看负整数的大小, 把 -2 改为 -12, 结果一样的.

 

      3.     mainSplitter->setStretchFactor(0, 0);
              mainSplitter->setStretchFactor(1, 0);

       效果同第二.

 

       4.       mainSplitter->setStretchFactor(0, 0);  //可以把这段注释掉, 效果一样
                 mainSplitter->setStretchFactor(1, 1);

       效果如下:

       

 

       5.     mainSplitter->setStretchFactor(0, 4);
               mainSplitter->setStretchFactor(1, 8);

       效果如下:

       

 

       6.     mainSplitter->setStretchFactor(0, -4);
               mainSplitter->setStretchFactor(1, 8);

      效果如下,

      

 

       从 1, 2 和 6 的测试效果可以看出, 拉伸系数为负整数的微件将占据最大的多余空间.

       从3, 4 和 5 的测试效果来看, 就算我们不设置 B 或 A 的拉伸系数stretch, 他们内部也应该存在着一个默认拉伸系数值0. stretch为 0 的微件, 将把最大多余空间让给stretch 为正整数的微件. 如果有多个stretch 为正整数的微件, 他们的多余空间的占有率由通过数字的比例来确定的.


注:因此,我的堆栈窗体程序中的

     mainLayout->setStretchFactor(leftlist,1);
     mainLayout->setStretchFactor(stack,3);
就是设定了list与stack比例为1:3。


5.设定消息相应的信号与槽:

connect(leftlist,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));

都是控件自带的信号与槽,这里将其关联起来,就达到了程序的设计效果:

更改第几行就显示第几个Label。

最后编译运行:



 

 

两种进度条显示:

QProgressBar和QProgressDialog

下面例子展示两种进度条:

     

代码:

头文件dialog.h中:

[cpp] view plaincopyprint?
  1. #include <QtGui/QDialog>   
  2. #include <QLabel>   
  3. #include <QLineEdit>   
  4. #include <QProgressBar>   
  5. #include <QComboBox>   
  6. #include <QPushButton>   
  7. #include <QGridLayout>   
  8. class Dialog : public QDialog  
  9. {  
  10.     Q_OBJECT  
  11.   
  12. public:  
  13.     Dialog(QWidget *parent = 0);  
  14.     ~Dialog();  
  15. private slots:  
  16.     void startProgress();  
  17. private:  
  18.     QLabel *FileNum;  
  19.     QLineEdit *FileNumLineEdit;  
  20.     QLabel *ProgressType;  
  21.     QComboBox *comboBox;  
  22.     QProgressBar *progressBar;  
  23.     QPushButton *startBtn;  
  24.     QGridLayout *mainLayout;  
  25. };  
[cpp] view plaincopyprint?
  1. #include <QtGui/QDialog>   
  2. #include <QLabel>   
  3. #include <QLineEdit>   
  4. #include <QProgressBar>   
  5. #include <QComboBox>   
  6. #include <QPushButton>   
  7. #include <QGridLayout>   
  8. class Dialog : public QDialog  
  9. {  
  10.     Q_OBJECT  
  11.   
  12. public:  
  13.     Dialog(QWidget *parent = 0);  
  14.     ~Dialog();  
  15. private slots:  
  16.     void startProgress();  
  17. private:  
  18.     QLabel *FileNum;  
  19.     QLineEdit *FileNumLineEdit;  
  20.     QLabel *ProgressType;  
  21.     QComboBox *comboBox;  
  22.     QProgressBar *progressBar;  
  23.     QPushButton *startBtn;  
  24.     QGridLayout *mainLayout;  
  25. };  


源文件:

[cpp] view plaincopyprint?
  1. #include "dialog.h"   
  2. #include <QProgressDialog>   
  3. #include <QFont>   
  4.   
  5. Dialog::Dialog(QWidget *parent)  
  6.     : QDialog(parent)  
  7. {  
  8.     setWindowTitle(tr("Progress"));  
  9.   
  10.     FileNum=new QLabel;  
  11.     FileNum->setText(tr("文件数目:"));  
  12.     FileNumLineEdit=new QLineEdit;  
  13.     FileNumLineEdit->setText(tr("10000"));  
  14.   
  15.     ProgressType=new QLabel;  
  16.     ProgressType->setText(tr("显示类型:"));  
  17.     comboBox=new QComboBox;  
  18.     comboBox->addItem(tr("progressBar"));  
  19.     comboBox->addItem(tr("progressDialog"));  
  20.   
  21.     progressBar=new QProgressBar;  
  22.   
  23.     startBtn=new QPushButton;  
  24.     startBtn->setText(tr("开始"));  
  25.   
  26.     mainLayout=new QGridLayout(this);  
  27.     mainLayout->addWidget(FileNum,0,0);  
  28.     mainLayout->addWidget(FileNumLineEdit,0,1);  
  29.     mainLayout->addWidget(ProgressType,1,0);  
  30.     mainLayout->addWidget(comboBox,1,1);  
  31.     mainLayout->addWidget(progressBar,2,0,1,2);  
  32.     mainLayout->addWidget(startBtn,3,1);  
  33.     mainLayout->setMargin(15);  
  34.     mainLayout->setSpacing(10);  
  35.   
  36.     connect(startBtn,SIGNAL(clicked()),this,SLOT(startProgress()))  
  37. }  
[cpp] view plaincopyprint?
  1. #include "dialog.h"   
  2. #include <QProgressDialog>   
  3. #include <QFont>   
  4.   
  5. Dialog::Dialog(QWidget *parent)  
  6.     : QDialog(parent)  
  7. {  
  8.     setWindowTitle(tr("Progress"));  
  9.   
  10.     FileNum=new QLabel;  
  11.     FileNum->setText(tr("文件数目:"));  
  12.     FileNumLineEdit=new QLineEdit;  
  13.     FileNumLineEdit->setText(tr("10000"));  
  14.   
  15.     ProgressType=new QLabel;  
  16.     ProgressType->setText(tr("显示类型:"));  
  17.     comboBox=new QComboBox;  
  18.     comboBox->addItem(tr("progressBar"));  
  19.     comboBox->addItem(tr("progressDialog"));  
  20.   
  21.     progressBar=new QProgressBar;  
  22.   
  23.     startBtn=new QPushButton;  
  24.     startBtn->setText(tr("开始"));  
  25.   
  26.     mainLayout=new QGridLayout(this);  
  27.     mainLayout->addWidget(FileNum,0,0);  
  28.     mainLayout->addWidget(FileNumLineEdit,0,1);  
  29.     mainLayout->addWidget(ProgressType,1,0);  
  30.     mainLayout->addWidget(comboBox,1,1);  
  31.     mainLayout->addWidget(progressBar,2,0,1,2);  
  32.     mainLayout->addWidget(startBtn,3,1);  
  33.     mainLayout->setMargin(15);  
  34.     mainLayout->setSpacing(10);  
  35.   
  36.     connect(startBtn,SIGNAL(clicked()),this,SLOT(startProgress()))  
  37. }  
[cpp] view plaincopyprint?
  1. void Dialog::startProgress()  
  2. {  
  3.     bool ok;  
  4.     int num=FileNumLineEdit->text().toInt(&ok);  
  5.     if(!ok)  
  6.         return;  
  7.     if(comboBox->currentIndex()==0)  
  8.     {  
  9.         progressBar->setRange(0,num);  
  10.         for(int i=1;i<=num;i++)  
  11.         {  
  12.             progressBar->setValue(i);  
  13.         }  
  14.     }  
  15.     else if(comboBox->currentIndex()==1)  
  16.     {  
  17.         QProgressDialog *progressDlg=new QProgressDialog(this);  
  18.         QFont font("ZYSong18030",12);  
  19.         progressDlg->setFont(font);  
  20.         progressDlg->setWindowModality(Qt::WindowModal);  
  21.         progressDlg->setMinimumDuration(5);  
  22.         progressDlg->setWindowTitle(tr("please wait"));  
  23.         progressDlg->setLabelText(tr("正在复制......      "));  
  24.         progressDlg->setCancelButtonText(tr("取消"));  
  25.         progressDlg->setRange(0,num);  
  26.         for(int i=1;i<=num;i++)  
  27.         {  
  28.             progressDlg->setValue(i);  
  29.             if(progressDlg->wasCanceled())  
  30.                 return;  
  31.         }  
  32.     }  
  33. }  
[cpp] view plaincopyprint?
  1. void Dialog::startProgress()  
  2. {  
  3.     bool ok;  
  4.     int num=FileNumLineEdit->text().toInt(&ok);  
  5.     if(!ok)  
  6.         return;  
  7.     if(comboBox->currentIndex()==0)  
  8.     {  
  9.         progressBar->setRange(0,num);  
  10.         for(int i=1;i<=num;i++)  
  11.         {  
  12.             progressBar->setValue(i);  
  13.         }  
  14.     }  
  15.     else if(comboBox->currentIndex()==1)  
  16.     {  
  17.         QProgressDialog *progressDlg=new QProgressDialog(this);  
  18.         QFont font("ZYSong18030",12);  
  19.         progressDlg->setFont(font);  
  20.         progressDlg->setWindowModality(Qt::WindowModal);  
  21.         progressDlg->setMinimumDuration(5);  
  22.         progressDlg->setWindowTitle(tr("please wait"));  
  23.         progressDlg->setLabelText(tr("正在复制......      "));  
  24.         progressDlg->setCancelButtonText(tr("取消"));  
  25.         progressDlg->setRange(0,num);  
  26.         for(int i=1;i<=num;i++)  
  27.         {  
  28.             progressDlg->setValue(i);  
  29.             if(progressDlg->wasCanceled())  
  30.                 return;  
  31.         }  
  32.     }  
  33. }  



 

main函数添加显示中文的代码:

[cpp] view plaincopyprint?
  1. #include <QtGui/QApplication>   
  2. #include "dialog.h"   
  3. #include <QTextCodec>   
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     QTextCodec::setCodecForTr(QTextCodec::codecForLocale());  
  8.     Dialog w;  
  9.     w.show();  
  10.   
  11.     return a.exec();  
  12. }  
[cpp] view plaincopyprint?
  1. #include <QtGui/QApplication>   
  2. #include "dialog.h"   
  3. #include <QTextCodec>   
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     QTextCodec::setCodecForTr(QTextCodec::codecForLocale());  
  8.     Dialog w;  
  9.     w.show();  
  10.   
  11.     return a.exec();  
  12. }  


 

 

一下是我写的停靠窗口例子:




下面用代码实现上面窗口的设计:

1.建立项目时基类选择QMainWindow,取消Gernerate form复选框的选中状态。

2.在源文件mainwindow.cpp中编写如下代码:

[cpp] view plaincopyprint?
  1. #include "mainwindow.h"   
  2. #include <QTextEdit>   
  3. #include <QDockWidget>   
  4. MainWindow::MainWindow(QWidget *parent)  
  5.     : QMainWindow(parent)  
  6. {  
  7.     //设置主窗口   
  8.     setWindowTitle(tr("DockWindwos"));  
  9.     QTextEdit *te=new QTextEdit(this);  
  10.     te->setText(tr("Main Window"));  
  11.     te->setAlignment(Qt::AlignCenter);  
  12.     setCentralWidget(te);  
  13.     //设置停靠窗口1   
  14.     QDockWidget *dock=new QDockWidget(tr("DockWindow1"),this);  
  15.     dock->setFeatures(QDockWidget::DockWidgetMovable);  
  16.     dock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);  
  17.     QTextEdit *te1=new QTextEdit();  
  18.     te1->setText(tr("Window1,The dock widget can be moved between docks by the user"));  
  19.     dock->setWidget(te1);  
  20.     addDockWidget(Qt::RightDockWidgetArea,dock);  
  21.     //设置停靠窗口2   
  22.     dock=new QDockWidget(tr("DockWindow2"),this);  
  23.     dock->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable);  
  24.     QTextEdit *te2=new QTextEdit();  
  25.     te2->setText(tr("Window2,The dock widget can floated and can be closed"));  
  26.     dock->setWidget(te2);  
  27.     addDockWidget(Qt::RightDockWidgetArea,dock);  
  28.     //设置停靠窗口3   
  29.     dock=new QDockWidget(tr("DockWindow3"),this);  
  30.     dock->setFeatures(QDockWidget::AllDockWidgetFeatures);  
  31.     QTextEdit *te3=new QTextEdit();  
  32.     te3->setText(tr("Window3,The dock widget can be closed, moved and floated"));  
  33.     dock->setWidget(te3);  
  34.     addDockWidget(Qt::RightDockWidgetArea,dock);  
  35. }  
  36.   
  37. MainWindow::~MainWindow()  
  38. {  
  39.   
  40. }  
[cpp] view plaincopyprint?
  1. #include "mainwindow.h"   
  2. #include <QTextEdit>   
  3. #include <QDockWidget>   
  4. MainWindow::MainWindow(QWidget *parent)  
  5.     : QMainWindow(parent)  
  6. {  
  7.     //设置主窗口   
  8.     setWindowTitle(tr("DockWindwos"));  
  9.     QTextEdit *te=new QTextEdit(this);  
  10.     te->setText(tr("Main Window"));  
  11.     te->setAlignment(Qt::AlignCenter);  
  12.     setCentralWidget(te);  
  13.     //设置停靠窗口1   
  14.     QDockWidget *dock=new QDockWidget(tr("DockWindow1"),this);  
  15.     dock->setFeatures(QDockWidget::DockWidgetMovable);  
  16.     dock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);  
  17.     QTextEdit *te1=new QTextEdit();  
  18.     te1->setText(tr("Window1,The dock widget can be moved between docks by the user"));  
  19.     dock->setWidget(te1);  
  20.     addDockWidget(Qt::RightDockWidgetArea,dock);  
  21.     //设置停靠窗口2   
  22.     dock=new QDockWidget(tr("DockWindow2"),this);  
  23.     dock->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable);  
  24.     QTextEdit *te2=new QTextEdit();  
  25.     te2->setText(tr("Window2,The dock widget can floated and can be closed"));  
  26.     dock->setWidget(te2);  
  27.     addDockWidget(Qt::RightDockWidgetArea,dock);  
  28.     //设置停靠窗口3   
  29.     dock=new QDockWidget(tr("DockWindow3"),this);  
  30.     dock->setFeatures(QDockWidget::AllDockWidgetFeatures);  
  31.     QTextEdit *te3=new QTextEdit();  
  32.     te3->setText(tr("Window3,The dock widget can be closed, moved and floated"));  
  33.     dock->setWidget(te3);  
  34.     addDockWidget(Qt::RightDockWidgetArea,dock);  
  35. }  
  36.   
  37. MainWindow::~MainWindow()  
  38. {  
  39.   
  40. }  



 

解析:

1.创建一个QDockWidget对象的停靠窗体:

    QDockWidget *dock=new QDockWidget(tr("DockWindow1"),this);

第一个参数是停靠窗体的名称,第二个参数是停靠窗体的父窗体。


2.设置此停靠窗体的属性:

    dock->setFeatures(QDockWidget::DockWidgetMovable);

设置停靠窗体特性:

×可关闭:有一个关闭按钮

×可移动:


将DockWindow移动到左边了。

×可浮动:


DockWindow3可以单独脱离主窗口浮动出来。

×其他参数:

QDockWidget::AllDockWidgetFeatures  //拥有所有属性
QDockWidget::NoDockWidgetFeatures   //不可移动,不可关闭,不可浮动


3.将TextEdit加入停靠窗体

dock->setWidget(te1);


4.将停靠窗体加入主窗体中

addDockWidget(Qt::RightDockWidgetArea,dock);


最后编译运行: