当前位置:首页 » 《资源分享》 » 正文

【QT】Qt窗口组成和初识对话框

0 人参与  2024年11月10日 16:41  分类 : 《资源分享》  评论

点击全文阅读


在这里插入图片描述

个人主页~


Qt窗口

一、菜单栏二、工具栏三、状态栏四、浮动窗口五、对话框1、简介(1)模态对话框(2)非模态对话框(3)混合属性对话框
Qt窗口是通过QMainWindow类来实现的,我们之前的学习是通过QWidget类实现的

QMainWindow包含一个菜单栏Menu Bar②,多个工具栏Tool Bars③,多个浮动窗口Dock Widgets,一个状态栏Status Bar⑤和一个中心部件Central Widget④
①是Window Title

在这里插入图片描述

一、菜单栏

MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)    , ui(new Ui::MainWindow){    ui->setupUi(this);    //设置窗口名    this->setWindowTitle("我的word文件");//创建菜单栏,将菜单栏设置到窗口当中    QMenuBar* mb = new QMenuBar(this);    this->setMenuBar(mb);//设置菜单名,将菜单设置到菜单栏中    QMenu* m = new QMenu("文件");    mb->addMenu(m);//设置菜单项,将菜单项设置到菜单当中    QAction* a1 = new QAction("打开");    QAction* a2 = new QAction("保存");    QAction* a3 = new QAction("关闭");    m->addAction(a1);    m->addAction(a2);    m->addAction(a3);//设置中心部件    QTextEdit* te = new QTextEdit(this);    this->setCentralWidget(te);    te->setPlaceholderText("请输入");}

menubar

让我们加上对应的功能

    connect(a1,&QAction::triggered,this,&MainWindow::load);    connect(a2,&QAction::triggered,this,&MainWindow::save);    connect(a3,&QAction::triggered,this,&MainWindow::quit);
void MainWindow::save(){//创建文件对话框    QFileDialog* dg = new QFileDialog(this);//根据文件名创建文本文件    QString filename = dg->getSaveFileName(this,"保存文件","C:/Users/14725/Desktop");    qDebug() << filename;    //将filename转换成一个标准C字符串,然后使用这个路径来创建一个std::ofstream对象file,以便打开并写入文件    std::ofstream file(filename.toStdString().c_str());    if(!file.is_open())    {        qDebug() << "文件保存失败";        return;    }    //将textedit中的内容通过普通文本存放在text中    const QString& text = te->toPlainText();    //通过流输入到file文件    file << text.toStdString();    //关闭文件    file.close();}void MainWindow::load(){//创建文件对话框    QFileDialog* d = new QFileDialog(this);    //获取到指定位置的文件名    QString filename = d->getOpenFileName(this,"加载文件","C:/Users/14725/Desktop");    //将filename转换成一个标准C字符串,然后使用这个路径来创建一个std::ifstream对象file,以便加载文件    std::ifstream file(filename.toStdString().c_str());    if(!file.is_open())    {        qDebug() << "文件加载失败";        return;    }    //创建两个字符串    std::string content;    std::string line;    //一行一行从文件中扫描输入到content    while (std::getline(file, line))    {        content += line;        content += "\n";    }    //关闭文件    file.close();    //获取到content内容,呈现到textedit当中    QString text = QString::fromStdString(content);    te->setPlainText(text);}

menubar_2

二、工具栏

MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)    , ui(new Ui::MainWindow){    ui->setupUi(this);//创建工具栏,将其添加到右侧区域    QToolBar* tb = new QToolBar(this);    addToolBar(Qt::RightToolBarArea,tb);//设置工具栏停留的位置只能为最左侧和最右侧    tb->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);//设置是否可以作为一个独立的窗口被拖拽    tb->setFloatable(false);//设置是否可以移动工具栏    tb->setMovable(true);//设置工具栏内容    QAction* openAction = new QAction("open",this);    QAction* newAction = new QAction("new",this);    tb->addAction(openAction);    tb->addSeparator();    tb->addAction(newAction);//在工具栏中添加控件    QLabel* label = new QLabel("super little monster",this);    tb->addWidget(label);}

toolbar

三、状态栏

MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)    , ui(new Ui::MainWindow){    ui->setupUi(this);//创建和设置状态栏,因为一个窗口创建默认有状态栏,//这里是直接把新创建的状态栏参数设置到已有的状态栏当中    QStatusBar* sb = statusBar();    setStatusBar(sb);//状态栏的显示内容和时间    sb->showMessage("super_little_monster",2000);//设置一个label设置到右下角永久显示,左下角永久显示就是用addWidget    QLabel* label = new QLabel("我在右下角",this);    sb->addPermanentWidget(label);}

statusbar

四、浮动窗口

MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)    , ui(new Ui::MainWindow){    ui->setupUi(this);//创建浮动窗口并将其设置在当前窗口中    QDockWidget* dw = new QDockWidget("浮动窗口",this);    addDockWidget(Qt::BottomDockWidgetArea,dw);//设置浮动窗口四个位置都可停靠,还有四个选项,分别是上下左右://Qt::TopDockWidgetArea//Qt::BottomDockWidgetArea//Qt::LeftDockWidgetArea//Qt::RightDockWidgetArea    dw->setAllowedAreas(Qt::AllDockWidgetAreas);}

dockwidget

五、对话框

1、简介

通常是一个顶层窗口,出现在屏幕最上层,用于实现短期任务或者简洁的用户交互,分为模态对话框和非模态对话框

(1)模态对话框

显示后无法与父窗口进行交互的的对话框叫做模态对话框,一般用作消息显示,文件选择等,当模态对话框出现时,我们就不能操作父窗口了,例如word文档,当我们输入内容点击关闭时,弹出的对话框就是模态对话框,必须先对对话框进行交互才能进行下一步动作,不然父窗口是不能再编辑的
一般用QDialog::exec()函数调用,建立在栈区,因为该函数有阻塞作用,程序就会一直阻塞在这里不进行下一步
在这里插入图片描述

dialog

MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)    , ui(new Ui::MainWindow){    ui->setupUi(this);//新建一个工具栏,将打开工具设置到工具栏中    QToolBar* tb = new QToolBar(this);    QAction* a = new QAction("打开");    tb->addAction(a);//将点击打开按钮发送的信号与拉姆达表达式connect,实现弹出对话框效果    connect(a,&QAction::triggered,[=]()    {        QDialog dg(this);        dg.resize(300,400);        dg.exec();        //exec阻塞程序,在与对话框交互完成后程序继续执行,有点类似于stm32中的中断哈    });}

(2)非模态对话框

非模态对话框显示后独立存在,可以同时与父窗口进行交互,一般建立在堆区,因为其不影响父窗口的特性,也就是无阻塞,如果建立在栈区往往会一闪而过
一般用QDialog::show()函数调用

MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)    , ui(new Ui::MainWindow){    ui->setupUi(this);//新建一个工具栏,将打开工具设置到工具栏中    QToolBar* tb = new QToolBar(this);    QAction* a = new QAction("打开");    tb->addAction(a);//将点击打开按钮发送的信号与拉姆达表达式connect,实现弹出对话框效果    connect(a,&QAction::triggered,[=](){        QDialog* dialog = new QDialog(this);        dialog->resize(300,400);        dialog->setAttribute(Qt::WA_DeleteOnClose);        //QT内部的方法,当关闭窗口时释放窗口内存        dialog->show();        //show不阻塞程序,所以我们要将dialog建在堆上    });}

dialog_2

(3)混合属性对话框

混合属性对话框在生成和销毁上具有非模态对话框属性,在功能上具有模态对话框属性

使用QDialog::setModal(bool)函数来创建

MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)    , ui(new Ui::MainWindow){    ui->setupUi(this);    QToolBar* tb = new QToolBar(this);    QAction* a = new QAction("打开");    tb->addAction(a);    connect(a,&QAction::triggered,[=](){        QDialog* dialog = new QDialog(this);        dialog->resize(300,400);        dialog->setAttribute(Qt::WA_DeleteOnClose);        dialog->setModal(true);//注意,与上方的程序相比我只添加了这一行代码        dialog->show();    });}

dialog_3


今日分享到此结束~
在这里插入图片描述


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/184315.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1