QT不规则窗体图形(代码+详解)
来源:互联网 发布:数据流程图的组成要素 编辑:程序博客网 时间:2024/05/17 07:57
窗体可以设置为图片的形状
如下:
其实就是将窗体设置一个遮罩,此遮罩设为图片的遮罩即可
这里还涉及到一些Event的函数重载,具体看代码。
头文件:
- #include <QtGui/QWidget>
- #include <QLabel>
- #include <QPixmap>
- class Widget : public QWidget
- {
- Q_OBJECT
- public:
- 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;
- };
- #include <QtGui/QWidget>
- #include <QLabel>
- #include <QPixmap>
- class Widget : public QWidget
- {
- Q_OBJECT
- public:
- 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;
- };
#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;};
源文件:
- #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"));
- }
- #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"));
- }
#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中编写如下代码:
- #include <QtGui/QDialog>
- #include <QListWidget>
- #include <QStackedWidget>
- #include <QLabel>
- class Dialog : public QDialog
- {
- Q_OBJECT
- public:
- Dialog(QWidget *parent = 0);
- ~Dialog();
- private:
- QListWidget *leftlist;
- QStackedWidget *stack;
- QLabel *label1;
- QLabel *label2;
- QLabel *label3;
- };
- #include <QtGui/QDialog>
- #include <QListWidget>
- #include <QStackedWidget>
- #include <QLabel>
- class Dialog : public QDialog
- {
- Q_OBJECT
- public:
- Dialog(QWidget *parent = 0);
- ~Dialog();
- private:
- QListWidget *leftlist;
- QStackedWidget *stack;
- QLabel *label1;
- QLabel *label2;
- QLabel *label3;
- };
#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中编写如下代码:
- #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)));
- }
- #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)));
- }
#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中:
- #include <QtGui/QDialog>
- #include <QLabel>
- #include <QLineEdit>
- #include <QProgressBar>
- #include <QComboBox>
- #include <QPushButton>
- #include <QGridLayout>
- class Dialog : public QDialog
- {
- Q_OBJECT
- public:
- Dialog(QWidget *parent = 0);
- ~Dialog();
- private slots:
- void startProgress();
- private:
- QLabel *FileNum;
- QLineEdit *FileNumLineEdit;
- QLabel *ProgressType;
- QComboBox *comboBox;
- QProgressBar *progressBar;
- QPushButton *startBtn;
- QGridLayout *mainLayout;
- };
- #include <QtGui/QDialog>
- #include <QLabel>
- #include <QLineEdit>
- #include <QProgressBar>
- #include <QComboBox>
- #include <QPushButton>
- #include <QGridLayout>
- class Dialog : public QDialog
- {
- Q_OBJECT
- public:
- Dialog(QWidget *parent = 0);
- ~Dialog();
- private slots:
- void startProgress();
- private:
- QLabel *FileNum;
- QLineEdit *FileNumLineEdit;
- QLabel *ProgressType;
- QComboBox *comboBox;
- QProgressBar *progressBar;
- QPushButton *startBtn;
- QGridLayout *mainLayout;
- };
#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;};
源文件:
- #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()))
- }
- #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()))
- }
#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()))}
- 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;
- }
- }
- }
- 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;
- }
- }
- }
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函数添加显示中文的代码:
- #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();
- }
- #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();
- }
#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中编写如下代码:
- #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()
- {
- }
- #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()
- {
- }
#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);
最后编译运行:
- QT不规则窗体图形(代码+详解)
- QT不规则窗体图形(代码+详解)
- Qt 不规则窗体
- QT实现不规则窗体
- QT 不规则窗体
- QT实现不规则窗体
- Qt 不规则窗体 <摘抄>
- Qt绘制不规则窗体
- Qt 不规则窗体编程
- QT实现不规则窗体
- QT实现不规则窗体
- Qt 不规则窗体编程
- qt的不规则窗体
- Qt 不规则窗体的实现
- 【转】QT实现不规则窗体
- Qt不规则窗体的实现
- 【实例】Qt创建不规则窗体
- Qt不规则窗体的实现
- UVA 11292 - Dragon of Loowater
- hdoj_2112
- 2008新版眼保健操图解
- 合并排序
- Android开发第3-1课:支持不同的语言
- QT不规则窗体图形(代码+详解)
- C#获取当前时间日期
- Android开发第3-2课:支持不同的屏幕
- 分步学习Struts(四) 自己写Struts框架
- [小代码]设置并振动手机
- 详细剖析:ThinkPHP中实例化模型的四种方法详解
- AVRmeg16单片机实现按键控制LCD1602的数据显示
- 《C++程序设计教程》 钱能
- 【IPC通信】基于管道的popen和pclose函数