Qt02-窗体之QMainWindow(菜单栏和对话框)

一、菜单栏和工具栏

需要include QMenuBar, QMenu
工具栏中可以存放菜单栏中的快捷键
添加菜单栏、工具栏、状态栏、文本编辑区、浮动窗口

#include <QToolBar>
#include <QAction>
#include <QDebug>
#include <QPushButton>

MyWindow::MyWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MyWindow)
{
    ui->setupUi(this);

    /**
     =======添加菜单栏=====
    */

    // 菜单栏
    QMenuBar *mBar = menuBar();

    // 添加菜单
    QMenu *pFile = mBar->addMenu("文件");

    // 添加菜单项
    QAction *pNew = pFile->addAction("新建");
    // 给新建按钮添加Lambda触发函数表达式
    connect(pNew, &QAction::triggered,
            [=](){
                qDebug() << "新建被按下";
            });

    // 两个按钮之间添加分割线
    pFile->addSeparator();

    QAction *pOpen = pFile->addAction("打开");
    connect(pOpen, &QAction::triggered,
            [=](){
              qDebug() << "打开被按下";
            });

    /**
     =======添加工具栏, 菜单栏的快捷键=====
    */
    QToolBar *toolBar = addToolBar("toolBar");
    // 工具栏添加快捷键(将菜单栏中的按钮以及功能直接添加过来)
    toolBar->addAction(pNew);

    // 添加图标按钮的 快捷键
    QPushButton *b = new QPushButton(this);
    b->setText("(#^.^#)");
    toolBar->addWidget(b);

    connect(b, QPushButton::clicked,
            [=](){
            b->setText("^_^");
    });
    /**
     ============状态栏==========
    */
    QStatusBar *sBar = statusBar();  // 这里的statusBar的状态栏使用默认的const

    QLabel *label = new QLabel();
    label->setText("Normal text file");
    // addWidget默认从左往右添加
    sBar->addWidget(label);
    sBar->addWidget(new QLabel("2", this));
    // 从右往左添加
    sBar->addPermanentWidget(new QLabel("3", this));


    /**
     ============核心控件, 文本编辑区==========
    */
    QTextEdit *textEdit = new QTextEdit();
    setCentralWidget(textEdit); // 给主窗口中间设置控件


    /**
     ============核心控件, 浮动窗口==========
    */
    QDockWidget *dock = new QDockWidget(this);
    addDockWidget(Qt::LeftDockWidgetArea,dock); // Qt添加的位置

    QTextEdit *editArea = new QTextEdit(this);
    dock->setWidget(editArea);
}

二、模态对话框和非模态对话框

  • 模态对话框:点开对话框后不能操作其他对话框
  • 非模态:点开对话框后还可以操作其他对话框
  • 模态对话框实现
 QMenuBar *mBar = menuBar();
    QMenu *menu = mBar->addMenu("对话框");
    QAction *p1 = menu->addAction("模态对话框");

    // 添加模态对话框
    connect(p1, &QAction::triggered,
            [=](){
                QDialog dlg;
                dlg.exec();
                qDebug() << "1111";
            });
  • 非模态对话框不采用阻塞的 exec(),而是使用 show()方法,但是如果在lambda表达式中直接类似于上面方法创建,对话框会随着lambda表达式结束而退出,因此不能采用局部变量,或者使用动态分配空间
 connect(p2, &QAction::triggered,
            [=](){
			// dlg2是在.h文件中声明过的  Dialog dlg2;
            dlg2.show();

            // 程序结束后才释放内存,但是这种方法不好,如果多次点击会申请很多次空间并且每次申请完都得等程序结束才会释放
            QDialog *dlg3 = new  QDialog(this);
            dlg3->show();

            // 对话框关闭就会释放
            QDialog *dlg4 = new QDialog();  // 不指定父对象
            dlg4->setAttribute(Qt::WA_DeleteOnClose);   // 关闭对话框就释放
            dlg4->show();
            qDebug() <<  "结束" ;
        });
}

三、标准对话框和文件对话框

普通对话框
问题对话框:根据定义的全局变量来判断点击的是确定还是取消按钮
文件对话框:参数可以设置点击功能后打开的初始路径, 选择过滤的文件类型

   QAction *p3 = menu->addAction("关于对话框");
    connect(p3, &QAction::triggered,
            [=](){
                QMessageBox::about(this, "about", "关于qt");
            });

    QAction *p4 = menu->addAction("问题对话框");
    connect(p4, &QAction::triggered,
            [=](){
                // 返回的是按钮按完后的枚举类型
                int ret = QMessageBox::question(this, "question", "Are you ok?");

                switch(ret){
                case QMessageBox::Yes:
                    qDebug() << "OK";
                    break;
                case QMessageBox::Cancel:
                    qDebug() << "Canel";
                    break;
                default:
                    break;
                }
    });

    QAction *p5 = menu->addAction("文件对话框");
    connect(p5, &QAction::triggered,
            [=](){
                // 参数: 操作的父对象,名称,路径
                QString path = QFileDialog::getOpenFileName(
                            this,
                            "open",
                            "../",
                            "souce(*.cpp *.h);;Text(*.txt);;all(*.*)"
                            );
                qDebug() << path;
    });

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值