您的位置:首页 > 编程语言 > Qt开发

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

2017-10-16 10:22 489 查看
解决问题:本文以具体代码的形式讲解了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 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: