windows应用要素
- 菜单栏
- 工具栏
- 状态栏
- 核心窗体
实现一个类似记事本的窗体
#include "mainwindow.h"
#include <QMainWindow>
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QToolBar>
#include <QPushButton>
#include <QStatusBar>
#include <QLabel>
#include <QTextEdit>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
//创建菜单栏
QMenuBar *mBar= menuBar();
//为菜单栏添加菜单选项
QMenu *pFile=mBar->addMenu("文件");
QMenu *pEdit=mBar->addMenu("编辑");
QMenu *pForm=mBar->addMenu("格式");
QMenu *pSeek=mBar->addMenu("查看");
QMenu *pHelp=mBar->addMenu("编辑");
//填充菜单的文件项
QAction *pNew = pFile->addAction("新建文件");
QAction *pOpen= pFile->addAction("打开文件");
QAction *pSave =pFile->addAction("保存");
QAction *pSaveAs=pFile->addAction("另存为··");
//添加工具栏
QToolBar *toolBar = addToolBar("工具栏");
toolBar->addSeparator();
toolBar->addAction(pNew);
toolBar->addAction(pOpen);
toolBar->addAction(pSave);
toolBar->addAction(pSaveAs);
//添加状态栏
QStatusBar *sBar= statusBar();
QLabel *label =new QLabel(this);
label->setText("Normal File");
sBar->addWidget(label);
//添加文本编辑区
QTextEdit *textEdit=new QTextEdit(parent);
//将文本编辑区设置为窗体中央
setCentralWidget(textEdit);
resize(400,300);
}
MainWindow::~MainWindow()
{
}
模态对话框和非模态对话框
模态对话框
弹出后只能在当前界面操作,不能对界面后面的窗口进行操作,只有等到当前窗口关闭后,才能进行其它操作。
connect(pNew,&QAction::triggered,
[=]()
{
QDialog win;
win.exec();
}
);
非模态对话框
窗口弹出后,不影响后续界面的操作,相当于窗口之间是独立的
connect(pNew,&QAction::triggered,
[=]()
{
QDialog win;
win.show();
}
);
上面写的并不好,计算机处理过快,看不到窗口就退出了,窗口属于局部变量,调用完就释放了。
connect(pNew,&QAction::triggered,
[=]()
{
QDialog* win=new QDialog win(this);
win->show();
}
);
这样动态分配空间,虽然能解决窗口不显示的问题,但是只要主窗体不关闭,那么分配的动态空间就不会被释放,在主窗体生命周期内,这个窗口如果被频繁调用,导致内存积压太大不合适,怎么解决?分配的时候不指定父对象,设置该对象调用完成后释放。
connect(pNew,&QAction::triggered,
[=]()
{
QDialog* win=new QDialog win(this);
//设置对象调用完释放,不用等到父对象释放时再释放
win->setAttribute(Qt::WA_DeleteOnClose);
win->show();
}
);
或者将窗口对象直接设置为公共成员对象,都可以避免这些问题。
一些标准的窗口函数
这些标准的窗口函数都包含在<QMessageBox>
类中,可以直接调用
文件选择窗口
打开文件时需要选择路径、文件类型等等窗口,这些QT
也有现成函数可供调用,包含在<QFileDialog>
类中
完整例子
#include "mainwindow.h"
#include <QMainWindow>
#include <QMenuBar>
#include <QAction>
#include <QMenu>
#include <QToolBar>
#include <QStatusBar>
#include <QLabel>
#include <QTextEdit>
#include <QDockWidget>
#include <QDebug>
#include <QDialog>
#include <QMessageBox>
#include <QFileDialog>
#include <QString>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
//创建菜单栏
QMenuBar *mBar = menuBar();
//为菜单栏添加菜单项
QMenu *mFile = mBar->addMenu("文件(F)");
QMenu *mEdit = mBar->addMenu("编辑(E)");
QMenu *mForm = mBar->addMenu("格式(O)");
QMenu *mOver = mBar->addMenu("查看(V)");
QMenu *mHelp = mBar->addMenu("帮助(H)");
//为菜单栏的文件菜单选项添加动作
QAction *fNew = mFile->addAction("新建");
QAction *fOpen= mFile->addAction("打开");
//添加分隔符
mFile->addSeparator();
QAction *fSave= mFile->addAction("保存");
QAction *fSaveas=mFile->addAction("另存为..");
//添加工具栏
QToolBar *toolBar = addToolBar("工具栏");
toolBar->addAction(fNew);
//添加状态栏
QStatusBar *sBar =statusBar();
QLabel *label = new QLabel(this);
label->setText("normaltex");
sBar->addWidget(label);
//添加文本输入
QTextEdit *text = new QTextEdit(this);
setCentralWidget(text);
//添加浮动输入窗口
QDockWidget *dock = new QDockWidget(this);
addDockWidget(Qt::RightDockWidgetArea,dock);
dock->setWindowTitle("浮动输入");
QTextEdit *text1 = new QTextEdit(this);
dock->setWidget(text1);
//模态对话框
connect(fNew,&QAction::triggered,
[=]()
{
QDialog win;
win.exec();
qDebug()<<"模态对话框关闭";
}
);
//非模态对话框
connect(fSave,&QAction::triggered,
[=]()
{
nowin.show();
}
);
//一些标准窗口的应用
//问题对话框
QAction *pQue = mFile->addAction("问题对话框");
connect(pQue,&QAction::triggered,
[=]()
{
int ret;
ret=QMessageBox::question(this,"question","are you ok?");
switch(ret)
{
case QMessageBox::Yes:
qDebug()<<"i am yes";
break;
case QMessageBox::No:
qDebug()<<"i am no";
break;
}
}
);
//文件打开对话框
//QAction *pfile =mBar->addAction("文件对话框");
connect(fOpen,&QAction::triggered,
[=]()
{
QString path;
path=QFileDialog::getOpenFileName(this,"open file","../","Image(*.png *.jpg);;"
"source(*.c *.cpp *.h);;"
"All(*.*)");
qDebug()<<path;
}
);
}
MainWindow::~MainWindow()
{
}