Qt窗口
概念简述
与QWidget的区别:
QWidget更多是作为一个窗口的一部分
基本结构构成:
以Xshell举例子比较菜单栏和工具栏:
菜单栏:
工具栏:
工具栏本质是把菜单栏中一些比较常用的选项,直接放到工具栏中,直接点击工具栏中的按钮就可以快速生效
菜单栏的使用
这里需要选择QMainWindow
通过ui文件创建菜单
创建好文件之后,打开ui文件会与之前的发生不同
如这里的“在这里输入”,这样就可以创建菜单了
创建好菜单栏想要创建菜单项会出现bug,无法直接输入中文,可以通过复制粘贴的方式进行,如在记事本中输入文本,再次粘贴到对话框中
运行结果如下:
使用代码的方式创建菜单结构
代码如下:
//1.创建一个菜单栏QMenuBar*menuBar=new QMenuBar();this->setMenuBar(menuBar);//2.创建菜单QMenu*menu1=new QMenu("文件");QMenu*menu2=new QMenu("编辑");QMenu*menu3=new QMenu("视图");menuBar->addMenu(menu1);menuBar->addMenu(menu2);menuBar->addMenu(menu3);//3.给菜单添加菜单项QAction*action1=new QAction("新建");QAction*action2=new QAction("打开");QAction*action3=new QAction("保存");QAction*action4=new QAction("另存为");QAction*action5=new QAction("退出");menu1->addAction(action1);menu1->addAction(action2);menu1->addAction(action3);menu1->addAction(action4);menu1->addAction(action5);
运行结果如下:
如何让点击菜单项有反应?
可以给用户添加信号槽:
//4.给action添加信号槽connect(action1,&QAction::triggered,this,&MainWindow::handle);connect(action5,&QAction::triggered,this,&MainWindow::close);
运行结果如下:
菜单添加快捷键
设置好快捷键可以结合alt使用
代码如下:
&并不会在窗口上显示
代码如下:
QMenuBar*menuBar=new QMenuBar();this->setMenuBar(menuBar);QMenu*menu1=new QMenu("文件(&F)");QMenu*menu2=new QMenu("视图(&V)");menuBar->addMenu(menu1);menuBar->addMenu(menu2);QAction*action1=new QAction("action1(&Q)");QAction*action2=new QAction("action2(&W)");QAction*action3=new QAction("action3(&E)");QAction*action4=new QAction("action4(&R)");menu1->addAction(action1);menu1->addAction(action2);menu2->addAction(action3);menu2->addAction(action4);connect(action1,&QAction::triggered,this,&MainWindow::handle1);connect(action2,&QAction::triggered,this,&MainWindow::handle2);connect(action3,&QAction::triggered,this,&MainWindow::handle3);connect(action4,&QAction::triggered,this,&MainWindow::handle4);
添加子菜单
运行结果:
添加分割线
运行结果:
添加图标
代码如下:
QMenuBar*menuBar=new QMenuBar();this->setMenuBar(menuBar);QMenu*menu=new QMenu("菜单");menuBar->addMenu(menu);QAction*action1=new QAction("菜单项1");action1->setIcon(QIcon(":/open.png"));QAction*action2=new QAction("菜单项2");action2->setIcon(QIcon(":/save.png"));menu->addAction(action1);menu->addAction(action2);
运行结果如下:
如果给菜单设置图标呢?
此时只会显示图标,文字会被覆盖
关于创建MenuBar的讨论
QMenuBar*menuBar=new QMenuBar();this->setMenuBar(menuBar);
如果没有点击自动勾选ui,此代码是OK,如果勾选则会造成内存泄漏
之前的程序已经自己创建了一个对象,当自己通过代码设置的时候,旧的会从对象树上脱离,导致资源泄漏
如果关闭的话,对象树会结束,此进程也会结束,不会造成影响,但是如果频繁切换窗口,会有问题
更规范的写法:
QMenuBar*menuBar=this->menuBar();
如果存在直接返回,不存在会创建新的再返回
如果在以后工作中遇到嵌入式,内存很有限可能就不能够泄漏内存