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之菜单栏,和对话框的主要内容,如果未能解决你的问题,请参考以下文章