Qt:初步了解Windows窗口基本控件

解决问题:本文以具体代码的形式讲解了windows基本窗口的建立过程。

使用方法:为了深入理解,本文未使用Design设计器,而是以纯代码的形式来建立窗口。

具体内容:Windows窗口的菜单栏、工具栏、状态栏、模态和非模态对话框的创建,以及使用MessageBox函数来创建标准对话框。

PS:代码是可以执行的,不存在语法问题。

1、mywindows.h

  1 #ifndef MYWINDOWS_H
  2 #define MYWINDOWS_H
  3 
  4 #include <QtGui/QMainWindow>
  5 
  6 class MyWindows : public QMainWindow
  7 {
  8 	Q_OBJECT
  9 
 10 public:
 11 	MyWindows(QWidget *parent = 0, Qt::WFlags flags = 0);
 12 	~MyWindows();
 13 	public slots:
 14 		void ST_Cout();
 15 		void ST_Cout2();
 16 		void p1_Dialog();
 17 		void p2_Dialog();
 18 		void p3_Dialog();
 19 		void p4_Dialog();
 20 
 21 private:
 22 
 23 };
 24 
 25 #endif // MYWINDOWS_H
 26 

2、mywindows.cpp(重点程序)

  1 #include "mywindows.h"
  2 #include <QMenuBar>
  3 #include <QMenu>
  4 #include<QAction>
  5 #include<QDebug>
  6 #include<QToolBar>
  7 #include<QPushButton>
  8 #include<QStatusBar>
  9 #include<QLabel>
 10 #include<QTextEdit>
 11 #include<QDockWidget>
 12 #include<QDialog>
 13 #include<QMessageBox>
 14 #include<QFileDialog>
 15 
 16 MyWindows::MyWindows(QWidget *parent, Qt::WFlags flags)
 17 	: QMainWindow(parent, flags)
 18 {
 19 	//一、创建菜单栏*******************************************
 20 	//存在逐级递进关系:菜单>>菜单栏>>菜单项(又称动作项)
 21 	//1、菜单栏
 22 	QMenuBar *mBar=menuBar();
 23 	//2、菜单
 24 	QMenu *pFile =mBar->addMenu("文件");
 25 	//3、菜单项(动作)
 26 	QAction *pNew= pFile->addAction("新建");
 27 	pFile->addSeparator();//添加分割线
 28 	QAction *pOpen= pFile->addAction("打开");
 29 	//可以发现,菜单栏、菜单、菜单项都没有用new来动态分配空间,因为menuBar()、addMenu()、addAction()三个返回值是contast型的
 30 
 31 	//二、创建工具栏*******************************************
 32 	//工具栏实际上是菜单项的快捷方式,也是有两级:工具栏>>动作项
 33 	//1、添加工具栏
 34 	QToolBar *toolBar = this->addToolBar("toolBar");
 35 	//2、添加动作项
 36 	toolBar->addAction(pNew);//将之前的“新建”动作项拿来用即可,注意是指针类型
 37 	//工具栏上还可以建立按钮(多数软件是这样的,而且图标可以加上图片)
 38 	QPushButton *PB_Open=new QPushButton(this);
 39 	PB_Open->setText("打开");
 40 	toolBar->addWidget(PB_Open);//将按钮加入到工具栏中
 41 
 42 	//三、创建状态栏*******************************************
 43 	//状态栏实际上存放的是标签Label
 44 	//1、创建状态栏
 45 	QStatusBar *StatusBar_MyWindow=statusBar();
 46 	//2、新建标签
 47 	QLabel *Label_MyWindow=new QLabel(this);
 48 	Label_MyWindow->setText("Normal text file");
 49 	//将标签加入到状态栏
 50 	StatusBar_MyWindow->addWidget(Label_MyWindow);
 51 	StatusBar_MyWindow->addWidget(new QLabel("Normal",this));//从左往右添加
 52 	StatusBar_MyWindow->addPermanentWidget(new QLabel("Error",this));//从右往左添加
 53 
 54 	//三、核心控件*******************************************
 55 	QTextEdit *textEdit = new QTextEdit(this);//文本编辑区
 56 	setCentralWidget(textEdit);//设置核心控件
 57 
 58 	//三、浮动窗口*******************************************
 59 	QDockWidget *dock =new QDockWidget(this);
 60 	addDockWidget(Qt::LeftDockWidgetArea,dock);//添加控件
 61 	dock->setWidget(new QTextEdit(this));
 62 
 63 	//三、模态与非模态对话框*******************************************
 64 	//添加一个菜单,存在一个菜单项,用来创建模态与非模态对话框,重点在槽函数里
 65 	QMenu *pDialog =mBar->addMenu("对话框");
 66 	QAction *p1= pDialog->addAction("模态对话框");
 67 	pDialog->addSeparator();//添加分割线
 68 	QAction *p2= pDialog->addAction("非模态对话框");
 69 
 70 	//四、标准对话框*******************************************
 71 	//添加一个菜单,存在一个菜单项,用来创建标准对话框,重点在槽函数里
 72 	QMenu *pStandardDialog =mBar->addMenu("标准对话框");
 73 	QAction *p3= pStandardDialog->addAction("关于");
 74 	pDialog->addSeparator();//添加分割线
 75 	QAction *p4= pStandardDialog->addAction("非模态对话框");
 76 
 77 
 78 	//信号与槽
 79 	QObject::connect(pNew,SIGNAL(triggered()),this,SLOT(ST_Cout()));//新建
 80 	QObject::connect(pOpen,SIGNAL(triggered()),this,SLOT(ST_Cout2()));//打开
 81 	QObject::connect(PB_Open,SIGNAL(clicked()),this,SLOT(ST_Cout2()));//打开
 82 	QObject::connect(p1,SIGNAL(triggered()),this,SLOT(p1_Dialog()));//建立模态对话框
 83 	QObject::connect(p2,SIGNAL(triggered()),this,SLOT(p2_Dialog()));//建立非模态对话框
 84 
 85 	QObject::connect(p3,SIGNAL(triggered()),this,SLOT(p3_Dialog()));//建立 关于 标准对话框
 86 	QObject::connect(p4,SIGNAL(triggered()),this,SLOT(p4_Dialog()));//建立 疑问 标准对话框
 87 }
 88 
 89 MyWindows::~MyWindows()
 90 {
 91 
 92 }
 93 void MyWindows::ST_Cout()
 94 {
 95 	qDebug()<<"新建";
 96 }
 97 //文件打开路径
 98 void MyWindows::ST_Cout2()
 99 {
100 	QString path=QFileDialog::getOpenFileName(this,"open","../","source(*.cpp *.h);;Text(*.txt);;all(*.*)");
101 	//"../"表示上一级路径
102 	qDebug()<<path;//将路径输出
103 }
104 
105 //(1)建立模态对话框*******************************************
106 void MyWindows::p1_Dialog()
107 {
108 	QDialog Dialog1;
109 	Dialog1.setWindowTitle("模态对话框");
110 	Dialog1.exec();
111 	//exec函数保证了对话框一直存在,且在该软件其他窗口之上,直到其退出,以此实现“模态”
112 	qDebug()<<"模态对话框";//可以注意,打印是在对话框退出之后再打印的
113 }
114 
115 //(2)建立非模态对话框*******************************************
116 void MyWindows::p2_Dialog()
117 {
118 	/*创建非模态对话框,不能直接在这里“QDialog Dialog2”。
119 	因为没有exec1函数,程序不会停留,直接运行到右大括号删除对象并退出 */
120 	//解决方法1:将Dialog2作为成员对象(简单,不在这里列出)
121 
122 	//解决方法2:动态分配空间,但是要解决内存泄漏问题*/
123 	QDialog *Dialog2 = new QDialog();
124 	//问题:虽然可以指定父对象,利用对象树释放,但是这是在整个程序最终退出时才释放,一旦多次创建这个对话框同样会出现内存泄露问题
125 	//解决方法:setAttribute函数设置属性
126 	Dialog2->setAttribute(Qt::WA_DeleteOnClose);//Qt::WA_DeleteOnClose属性是关闭时自动释放
127 	Dialog2->setWindowTitle("非模态对话框");
128 	Dialog2->show();
129 	qDebug()<<"非模态对话框";//可以注意,打印是在对话框创立的同时就打印的	
130 }
131 
132 //(3)使用QMessageBox函数建立标准对话框*******************************************
133 void MyWindows::p3_Dialog()
134 {
135 	//具体创建哪种对话框,请参见Qt助手中关于QMessageBox内静态成员函数的说明
136 	QMessageBox::about(this,"about","关于qt");
137 }
138 void MyWindows::p4_Dialog()
139 {
140 	//具体创建哪种对话框,请参见Qt助手中关于QMessageBox内静态成员函数的说明
141 	QMessageBox::question(this,"question","Are you ok?");//question是个枚举,函数是有返回值的
142 }

3、main.cpp

  1 #include "mywindows.h"
  2 #include <QtGui/QApplication>
  3 #include<QTextCodec>
  4 
  5 int main(int argc, char *argv[])
  6 {
  7 	QApplication a(argc, argv);
  8 	QTextCodec::setCodecForLocale(QTextCodec::codecForName("gb2312"));
  9 	QTextCodec::setCodecForCStrings(QTextCodec::codecForName("gb2312"));
 10 	QTextCodec::setCodecForTr(QTextCodec::codecForName("gb2312"));
 11 	MyWindows w;
 12 	w.show();
 13 	return a.exec();
 14 }
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值