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

来源:互联网 发布:宝冢96期事件 知乎 编辑:程序博客网 时间:2024/06/06 18:24

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

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

如下:

 

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

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

头文件:

[cpp] view plain copy print ?
  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 plain copy print ?
  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. };  
#include <QtGui/QWidget>#include <QLabel>#include <QPixmap>class Widget : public QWidget{    Q_OBJECTpublic:    Widget(QWidget *parent = 0);    ~Widget();protected://这里的三个函数都是重载函数,可以响应响应的事件    void mousePressEvent(QMouseEvent *);    void mouseMoveEvent(QMouseEvent *);    void paintEvent(QPaintEvent *);//这个在窗口需要重绘的时候自动调用private slots:    void showtime();private:    QPoint dragPosition;    QLabel *l;        QPixmap pix;};

源文件:
[cpp] view plain copy print ?
  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 plain copy print ?
  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. }  
#include "widget.h"#include <QMouseEvent>#include <QPainter>#include <QBitmap>#include <QGridLayout>#include <QTimer>#include <QTime>Widget::Widget(QWidget *parent)    : QWidget(parent){    setWindowFlags(Qt::FramelessWindowHint);    QPalette p=palette();    p.setColor(QPalette::WindowText,Qt::green);    setPalette(p);    l=new QLabel;    QTime time=QTime::currentTime();    QGridLayout *mainLayout=new QGridLayout(this);    mainLayout->addWidget(l,0,0,Qt::AlignHCenter);    pix.load("qq.png",0,Qt::AvoidDither|Qt::ThresholdDither|Qt::ThresholdAlphaDither);    resize(pix.size());    setMask(QBitmap(pix.mask()));    QTimer *timer=new QTimer;    connect(timer,SIGNAL(timeout()),this,SLOT(showtime()));    timer->start(10);}Widget::~Widget(){}void Widget::showtime(){    QTime time=QTime::currentTime();    l->setText(time.toString("A hh:mm:ss"));}void Widget::mousePressEvent(QMouseEvent *event){    if(event->button()==Qt::LeftButton)    {        dragPosition=event->globalPos()-frameGeometry().topLeft();        event->accept();    }    else if(event->button()==Qt::RightButton)    {        close();    }}void Widget::mouseMoveEvent(QMouseEvent *event){    move(event->globalPos()-dragPosition);    event->accept();}void Widget::paintEvent(QPaintEvent *event){    QPainter painter(this);    painter.drawPixmap(0,0,QPixmap("qq.png"));}

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

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

后面那个为了显示图片


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

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


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

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

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

[cpp] view plain copy print ?
  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 plain copy print ?
  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. };  
#include <QtGui/QDialog>#include <QListWidget>#include <QStackedWidget>#include <QLabel>class Dialog : public QDialog{    Q_OBJECTpublic:    Dialog(QWidget *parent = 0);    ~Dialog();private:    QListWidget *leftlist;    QStackedWidget *stack;    QLabel *label1;    QLabel *label2;    QLabel *label3;};

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

[cpp] view plain copy print ?
  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 plain copy print ?
  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. }  
#include "dialog.h"#include <QHBoxLayout>Dialog::Dialog(QWidget *parent)    : QDialog(parent){     setWindowTitle(tr("StackedWidget"));     //设置列表框     leftlist=new QListWidget(this);     leftlist->insertItem(0,tr("window1"));     leftlist->insertItem(1,tr("window2"));     leftlist->insertItem(2,tr("window3"));     //设置堆栈窗体     label1=new QLabel(tr("WindowTest1\n\tby liming"));     label2=new QLabel(tr("WindowTest2\n\tby liming"));     label3=new QLabel(tr("WindowTest3\n\tby liming"));     stack=new QStackedWidget(this);     stack->addWidget(label1);     stack->addWidget(label2);     stack->addWidget(label3);     //设置主窗体布局     QHBoxLayout *mainLayout=new QHBoxLayout(this);     mainLayout->setMargin(5);     mainLayout->setSpacing(5);     mainLayout->addWidget(leftlist);     mainLayout->addWidget(stack,0,Qt::AlignHCenter);     mainLayout->setStretchFactor(leftlist,1);     mainLayout->setStretchFactor(stack,3);     connect(leftlist,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));}

解析:

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 plain copy print ?
  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 plain copy print ?
  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. };  
#include <QtGui/QDialog>#include <QLabel>#include <QLineEdit>#include <QProgressBar>#include <QComboBox>#include <QPushButton>#include <QGridLayout>class Dialog : public QDialog{    Q_OBJECTpublic:    Dialog(QWidget *parent = 0);    ~Dialog();private slots:    void startProgress();private:    QLabel *FileNum;    QLineEdit *FileNumLineEdit;    QLabel *ProgressType;    QComboBox *comboBox;    QProgressBar *progressBar;    QPushButton *startBtn;    QGridLayout *mainLayout;};

源文件:

[cpp] view plain copy print ?
  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 plain copy print ?
  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. }  
#include "dialog.h"#include <QProgressDialog>#include <QFont>Dialog::Dialog(QWidget *parent)    : QDialog(parent){    setWindowTitle(tr("Progress"));    FileNum=new QLabel;    FileNum->setText(tr("文件数目:"));    FileNumLineEdit=new QLineEdit;    FileNumLineEdit->setText(tr("10000"));    ProgressType=new QLabel;    ProgressType->setText(tr("显示类型:"));    comboBox=new QComboBox;    comboBox->addItem(tr("progressBar"));    comboBox->addItem(tr("progressDialog"));    progressBar=new QProgressBar;    startBtn=new QPushButton;    startBtn->setText(tr("开始"));    mainLayout=new QGridLayout(this);    mainLayout->addWidget(FileNum,0,0);    mainLayout->addWidget(FileNumLineEdit,0,1);    mainLayout->addWidget(ProgressType,1,0);    mainLayout->addWidget(comboBox,1,1);    mainLayout->addWidget(progressBar,2,0,1,2);    mainLayout->addWidget(startBtn,3,1);    mainLayout->setMargin(15);    mainLayout->setSpacing(10);    connect(startBtn,SIGNAL(clicked()),this,SLOT(startProgress()))}
[cpp] view plain copy print ?
  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 plain copy print ?
  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. }  
void Dialog::startProgress(){    bool ok;    int num=FileNumLineEdit->text().toInt(&ok);    if(!ok)        return;    if(comboBox->currentIndex()==0)    {        progressBar->setRange(0,num);        for(int i=1;i<=num;i++)        {            progressBar->setValue(i);        }    }    else if(comboBox->currentIndex()==1)    {        QProgressDialog *progressDlg=new QProgressDialog(this);        QFont font("ZYSong18030",12);        progressDlg->setFont(font);        progressDlg->setWindowModality(Qt::WindowModal);        progressDlg->setMinimumDuration(5);        progressDlg->setWindowTitle(tr("please wait"));        progressDlg->setLabelText(tr("正在复制......      "));        progressDlg->setCancelButtonText(tr("取消"));        progressDlg->setRange(0,num);        for(int i=1;i<=num;i++)        {            progressDlg->setValue(i);            if(progressDlg->wasCanceled())                return;        }    }}

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

[cpp] view plain copy print ?
  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 plain copy print ?
  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. }  
#include <QtGui/QApplication>#include "dialog.h"#include <QTextCodec>int main(int argc, char *argv[]){    QApplication a(argc, argv);    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());    Dialog w;    w.show();    return a.exec();}

 

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


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

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

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

[cpp] view plain copy print ?
  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 plain copy print ?
  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. }  
#include "mainwindow.h"#include <QTextEdit>#include <QDockWidget>MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent){    //设置主窗口    setWindowTitle(tr("DockWindwos"));    QTextEdit *te=new QTextEdit(this);    te->setText(tr("Main Window"));    te->setAlignment(Qt::AlignCenter);    setCentralWidget(te);    //设置停靠窗口1    QDockWidget *dock=new QDockWidget(tr("DockWindow1"),this);    dock->setFeatures(QDockWidget::DockWidgetMovable);    dock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);    QTextEdit *te1=new QTextEdit();    te1->setText(tr("Window1,The dock widget can be moved between docks by the user"));    dock->setWidget(te1);    addDockWidget(Qt::RightDockWidgetArea,dock);    //设置停靠窗口2    dock=new QDockWidget(tr("DockWindow2"),this);    dock->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable);    QTextEdit *te2=new QTextEdit();    te2->setText(tr("Window2,The dock widget can floated and can be closed"));    dock->setWidget(te2);    addDockWidget(Qt::RightDockWidgetArea,dock);    //设置停靠窗口3    dock=new QDockWidget(tr("DockWindow3"),this);    dock->setFeatures(QDockWidget::AllDockWidgetFeatures);    QTextEdit *te3=new QTextEdit();    te3->setText(tr("Window3,The dock widget can be closed, moved and floated"));    dock->setWidget(te3);    addDockWidget(Qt::RightDockWidgetArea,dock);}MainWindow::~MainWindow(){}

解析:

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

最后编译运行: