Qt入门(二)做一个类似记事本的窗口

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()
{

}

猜你喜欢

转载自blog.csdn.net/z961968549/article/details/80855934