Qt之菜单栏,和对话框

Posted 1314bjwg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt之菜单栏,和对话框相关的知识,希望对你有一定的参考价值。

main.cpp

 1 #include "mainwindow.h"
 2 #include <QApplication>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     QApplication a(argc, argv);
 7     MainWindow w;
 8     w.show();
 9     return a.exec();
10 }

mainwindow.cpp

  1 #include "mainwindow.h"
  2 #include "ui_mainwindow.h"
  3 #include<QMenuBar>  //菜单栏类
  4 #include<QMenu> //菜单类.
  5 #include<QAction> //动作类()
  6 #include<QDebug>
  7 #include<QToolBar>  //工具栏
  8 #include<QPushButton>
  9 #include<QStatusBar> //状态栏
 10 #include<QLabel>
 11 #include<QTextEdit>
 12 #include<QDockWidget>//浮动窗口
 13 #include<QDialog> //对话框
 14 #include<QMessageBox> //标准对话框类.
 15 #include<QFileDialog> //文件对话框
 16 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent),ui(new Ui::MainWindow)
 17 {
 18     ui->setupUi(this);
 19     //菜单栏
 20     QMenuBar *my_Bar = menuBar();//进行直接获取. QMenuBar *my_Bar = new QMenuBar()动态分配方式,存在局限,
 21     //添加菜单
 22  //my_Bar为QMenuBar类的对象,addMenu为类成员函数.该函数返回“文件”菜单对象.所以需要创建同类型的变量来接收,QMenu数据类型的pFile。
 23     QMenu *pFile = my_Bar->addMenu("文件");
 24     //给当前菜单添加功能;即菜单项.
 25     QAction *pNew = pFile->addAction("新建");
 26     connect(pNew,&QAction::triggered,
 27             [=]()
 28     {
 29            QWidget *my_widget = new QWidget;
 30            my_widget->setWindowTitle("新建窗口");
 31            my_widget->show();
 32             qDebug()<<"新建完成";
 33     }
 34             );
 35     pFile->addSeparator(); //添加分割线.
 36     QAction *pOpen = pFile->addAction("打开");
 37     connect(pOpen,&QAction::triggered,
 38             [=]()
 39     {
 40 
 41         qDebug()<<"打开完成";
 42     }
 43     );
 44     //添加工具栏,菜单项的快捷方式;
 45     QToolBar *toolBar = addToolBar("toolBar");  //【】
 46     //工具栏添加快捷键
 47     toolBar->addAction(pNew);
 48     //添加小控件
 49     QPushButton *button = new QPushButton(this);//分配的是this(当前对象)对象的空间.
 50     button->setText("^_^");
 51     toolBar->addWidget(button);
 52     connect(button,&QPushButton::pressed,
 53             [=]() //可以使用外面的对象,变量等.
 54     {
 55         button->setText("123");
 56     }
 57             );
 58     //添加状态栏:
 59     QStatusBar *bar = statusBar();//直接获取【】
 60     QLabel *label = new QLabel(this); //状态栏中状态控件是放在this窗口中
 61     label->setText("Normal text file");
 62     //addWidget()为从左往右进行添加.
 63     bar->addWidget(label);//添加到状态栏.等价于:bar->addWidget(new QLabel("3",this));
 64     //addPermanenWidget 从右往左添加
 65     bar->addPermanentWidget(new QLabel("从右往左添加",this));
 66 
 67     //核心控件
 68     QTextEdit *textEdit = new QTextEdit(this); //文本编辑框.
 69     setCentralWidget(textEdit);
 70     //浮动窗口
 71     QDockWidget *dock = new QDockWidget(this);
 72     addDockWidget(Qt::RightDockWidgetArea,dock);
 73     QTextEdit *textEdit1 = new QTextEdit(this); //文本编辑框  //注意父对象不是浮动窗口.
 74     dock->setWidget(textEdit1);
 75 
 76  /*模态对话框和非模态对话框。
 77   * 模态对话框:打开该窗口时就不能操作其他的窗口,在这里我们以能否执行qDbug()来测试模态对话框和非模态对话框.
 78  */
 79     QMenu *dialog_box = my_Bar->addMenu("对话框");
 80     QAction *M_dialog_box = dialog_box->addAction("模态对话框");
 81     QAction *NM_dialog_box = dialog_box->addAction("非模态对话框");
 82     M_dialog_box->setText("模态对话框");
 83     NM_dialog_box->setText("非模态对话框");
 84     connect(M_dialog_box,&QAction::triggered,
 85             [=]()
 86     {//方式一:dig对象的内存空间由函数的执行为结束点.
 87         QDialog dig;
 88         dig.exec(); //程序会卡在这个位置,函数就不会结束
 89         qDebug()<<"在模态对话框里不能操作";
 90 
 91     }
 92             );
 93     connect(NM_dialog_box,&QAction::triggered,
 94             [=]()
 95     {//方式一:
 96         /*
 97         QDialog N_dig;//非模态对话框.
 98         N_dig.show(); //程序执行到这里时不会像exec一样停在这里等待操作.所以会闪以下就关闭了窗口.
 99         qDebug()<<"非模态对话框";
100         */
101 
102      //方式二:使用动态分配,且指定父对象为Main_Widget.随着程序的结束而结束.但是这样会导致内存的堆积.
103         /*
104     QDialog *N_dig = new QDialog(this);
105     N_dig->show();
106     qDebug()<<"非模态对话框,此函数作用域释放,但由于对话框的父对象还没结束,所以非模态对话框不会结束";
107     */
108     //方式三:
109         QDialog *N_dig = new QDialog();
110         N_dig->setAttribute(Qt::WA_DeleteOnClose);
111         N_dig->show();
112     }
113     );
114     //标准对话框,和文件对话框.
115     QAction *standard_dbox = dialog_box->addAction("标准对话框");
116     connect(standard_dbox,&QAction::triggered,
117             [=]()
118     {
119         QMessageBox::about(this,"内容框","关于Qt");
120     }
121     );
122     QAction *question_dig = dialog_box->addAction("问题对话框");
123     connect(question_dig,&QAction::triggered,
124 
125             [=]()
126     {
127         //返回的是布尔值.
128         int ret = QMessageBox::question(this,"question_title","文本内容,ok and no",
129                                         QMessageBox::Cancel|QMessageBox::Help|QMessageBox::No);
130         switch (ret) {
131         case QMessageBox::Ok:qDebug()<<"i am ok";
132             break; //终止
133         case QMessageBox::No:qDebug()<<"i am no";
134             break;
135         case QMessageBox::Help:
136             help_widget();
137             /*该方式会导致default不能编写。
138             QWidget *help_widget = new QWidget; //注意不能指定父对象,this.个人认为受break的影响(在switch表达式中).
139             help_widget->setWindowTitle("帮助文档chuang窗口");
140             help_widget->show();
141             */
142             break;
143         default:
144            break;
145         }
146 
147     }
148     );
149     //文件对话框
150   QAction *File_dig = dialog_box->addAction("文件对话框");
151   connect(File_dig,&QAction::triggered,
152           [=]()
153   {
154       QString path = QFileDialog::getOpenFileName(this,"open","../",
155                 "souce(*.cpp *.h);;Text(*.txt);;Image(*.png *.jpg *.gif);;all(*.*)"); //*:表示通配符,注意正则表达式.
156       qDebug()<<path;
157   }
158           );
159 }
160 void MainWindow::help_widget()
161 {
162     //在类成员中动态分配内存,直到类结束时该空间才释放.
163     QWidget *help_widget = new QWidget;
164     help_widget->setWindowTitle("帮助文档chuang窗口");
165     help_widget->show();
166 }
167 MainWindow::~MainWindow() //析构函数,用来释放内存
168 {
169     delete ui;
170 }

mainwindow.h

 1 #ifndef MAINWINDOW_H
 2 #define MAINWINDOW_H
 3 
 4 #include <QMainWindow>
 5 
 6 QT_BEGIN_NAMESPACE
 7 namespace Ui { class MainWindow; }
 8 QT_END_NAMESPACE
 9 
10 class MainWindow : public QMainWindow
11 {
12     Q_OBJECT
13 
14 public:
15     MainWindow(QWidget *parent = nullptr);
16     ~MainWindow();
17     void help_widget();
18 
19 private:
20     Ui::MainWindow *ui;
21 };
22 #endif // MAINWINDOW_H

 

以上是关于Qt之菜单栏,和对话框的主要内容,如果未能解决你的问题,请参考以下文章

QT无标题窗口在任务栏显示关闭(增加系统菜单)

QT从控件部分知识点整理

Qt 向 QMainWindow 添加非菜单栏键盘快捷键

Qt:Mac 菜单栏的怪异之处

Qt中的主窗口之菜单栏

C++框架_之Qt的窗口部件系统的详解-上