解决问题:本文以具体代码的形式讲解了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 }