ToB企服应用市场:ToB评测及商务社交产业平台

标题: Qt学习第四篇(主窗口和ui的使用) [打印本页]

作者: 铁佛    时间: 2024-6-5 10:40
标题: Qt学习第四篇(主窗口和ui的使用)
QMainWindow

QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个停靠部件(dock widgets)、一个状态栏(status bar)及一个中央部件(central widget),是许多应用程序的底子,如文本编辑器,图片编辑器等。

菜单栏

一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下面。
  1. #include "mainwindow.h"
  2. #include <QApplication>
  3. #include <QMainWindow>
  4. #include <QMenu>
  5. #include <QMenuBar>
  6. #include <QAction>
  7. #include <QDebug>
  8. #include <QToolBar>
  9. #include <QObject>
  10. int main(int argc, char *argv[])
  11. {
  12.     QApplication a(argc, argv);
  13.     QMainWindow w;
  14.     QMenuBar *menubar = w.menuBar();// 获取主窗口的菜单栏指针
  15.     QMenu *menu = menubar->addMenu("menu");// 添加主菜单
  16.     QMenu *submenu = new QMenu("submenu");// 添加子菜单
  17.     menu->addMenu(submenu);
  18.     QAction *Action1 = submenu->addAction("action:kiss");
  19.     QAction *Action2 = submenu->addAction("action:hug");
  20.     qDebug() << "Active action:" << submenu->activeAction();  // 打印活动的动作
  21.     // 添加动作到工具栏
  22.     QToolBar* toolBar = w.addToolBar("Toolbar");
  23.     QAction* Action3 = toolBar->addAction("action:sleep");
  24.     QAction* Action4 = toolBar->addAction("action:play");
  25.     QObject::connect(Action1,&QAction::triggered,[&](){
  26.          qDebug() << "kiss triggered";
  27.     });
  28.     QObject::connect(Action2,&QAction::triggered,[&](){
  29.         qDebug() << "hug triggered";
  30.     });
  31.     QObject::connect(Action3,&QAction::triggered,[&](){
  32.         qDebug() << "sleep triggered";
  33.     });
  34.     QObject::connect(Action4,&QAction::triggered,[&](){
  35.         qDebug() << "play triggered";
  36.     });
  37.     w.show();
  38.     return a.exec();
  39. }
复制代码
这里我们答应了工具栏移动到左右和底部,初始的位置如下:

但是我们可以根据红箭头指向的位置进行拖动,



此外,我们看到工具栏里有一个是图形图标,但是其他都是字符,这就用到了我们资源文件的配置。
Qt的资源系统(Resource System)把图像文件的路径添加到.qrc文件中。.qrc文件是Qt用来构造和管理项目中静态资源(如图像、样式表、翻译文件等)的一种方式。资源文件答应你以一种平台无关的方式引用项目内的文件,并且在编译时,这些资源会被编译进应用程序的二进制文件中,便于部署和访问。
具体操作步骤如之前所述,简要回顾如下:
</ol>


使用setFloatable(trueOrFalse)函数来设定工具栏可否浮动
如许就代表可以把工具栏单独拉出整个窗口位置,false反之。
使用setMoveable(trueOrFalse)函数设定工具栏的可移动性:
<img alt="image-20240604201558061" loading="lazy">
我们设置为false之后发现原来左侧的一排可移动的点消失了,setMoveable(false)//工具条不可移动, 只能停靠在初始化的位置上。
状态栏

一个QMainWindow的程序最多只有一个状态栏。QMainWindow中可以有多个的部件都使用add…名字的函数,而只有一个的部件,就直接使用获取部件的函数,如menuBar。同理状态栏也提供了一个获取状态栏的函数statusBar(),没有就自动创建一个并返回状态栏的指针。
  1. toolBar->addAction(new QAction(QIcon(":/images/newfile.png"), "New", &w));
  2. toolBar->addAction(new QAction(QIcon(":/images/open.png"), "Open", &w));
  3. toolBar->addAction(new QAction(QIcon(":/images/1.png"), "Save", &w));
  4. // 设置工具栏可以停靠的所有区域
  5. toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea|Qt::BottomToolBarArea);
复制代码

停靠部件(也称为铆接部件、浮动窗口)

停靠部件 QDockWidget,也称浮动窗口,可以有多个。

QDockWidget提供了dock Widget的概念,也称为工具选项板或实用程序窗口。停靠窗口是放置在QMainWindow中央小部件周围的停靠小部件区域中的辅助窗口。停靠窗口可以在其当前区域内移动,移动到新区域,并由最终用户浮动(例如,取消停靠)。QDockWidget API答应程序员限制dock小部件移动、浮动和关闭的能力,以及它们可以放置的区域。
  1. w.statusBar()->showMessage("regina");
  2. w.statusBar()->showMessage("ivanlee",3000);//3秒消失
  3. //  添加一个永久显示的组件
  4. QLabel *permenentLabel = new QLabel("permenent status");
  5. w.statusBar()->addPermanentWidget(permenentLabel);
  6. QProgressBar *progressBar = new QProgressBar;
  7. w.statusBar()->addWidget(progressBar);
复制代码


ui


在这些地方可以进行添加和删除部件。
使用UI文件创建界面很轻松很便捷,他的原理就是每次我们保存UI文件的时候,QtCreator就自动帮我们将UI文件翻译成C++的图形界面创建代码。可以通过以下步骤查看代码
到工程编译目录,一般就是工程同级目录下会天生另一个编译目录,会找到一个带ui_前缀跟ui文件同名的.h文件,这就是代码


代码内容为:

在项目MainWindow的构造函数中会调用这个函数来初始化窗口,其实这里边就是初始化我们的各个控件。

ui使用信号槽

在UI编辑界面中使用信号和槽很方便,比如,拖出一个Button到窗口上,右键这个button,选择转到槽:

此时会出现这个控件(QPushButton)可以连接的各个信号,我们可以根据具体需求选中信号来创建一个连接这个信号的槽函数:

以click(bool)信号为例,创建了一个槽函数。这个槽函数是QtCreator自动帮我们创建的,而且也使用天生C++代码的方式帮我们做好了连接,我们可以直接在这个函数体内实现功能就行。很方便,比使用Lambda表达式还方便。

可以使用动作编辑器旁边的信号槽编辑器,里边也可以添加信号和槽的连接,比如添加PushButton的clicked信号和radioButton槽的连接:

按住F4键就可以看到相互的关系


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4