目录
一、目的
1、想提高Qt知识
2、想知道QMainWindow
二、参考
1、
三、问题
1、刚刚新建工程时候,发现中文路径然后就报错运行不了,修改成英文路径就可以了
1、按钮、菜单栏等中文都是乱码
四、操作一:创建一些菜单栏、工具栏、状态栏、铆接部件、核心部件(中心部件)
1、运行结果:
1、创建Qt Widgets Application、QMainWindow、不要产生UI框架
2、mainwindow.h
3、mainwindow.cpp
4、main.cpp
一、QMainWindow
5.1 菜单栏
5.2 工具栏
5.3 状态栏
5.4 铆接部件
5.5 核心部件(中心部件)
5.6 资源文件
一、目的
1、想提高Qt知识
2、想知道QMainWindow
二、参考
1、
三、问题
1、刚刚新建工程时候,发现中文路径然后就报错运行不了,修改成英文路径就可以了
1、按钮、菜单栏等中文都是乱码
①发现按照网上设置或者代码设置是可以的,不过要多试几次,可能因为QtCreator原因
参考:
a、Qt问题:中文乱码+常量中有换行符
https://blog.csdn.net/qq_40544338/article/details/106170022
总结:good:自己总结的,能狗解决问题
四、操作一:创建一些菜单栏、工具栏、状态栏、铆接部件、核心部件(中心部件)
1、运行结果:
①自己创建了一些菜单栏、工具栏、状态栏、铆接部件、核心部件(中心部件)

1、创建Qt Widgets Application、QMainWindow、不要产生UI框架

2、mainwindow.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> //#pragma execution_character_set("utf-8") class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); }; #endif // MAINWINDOW_H |
3、mainwindow.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | #include "mainwindow.h" #include <QMenu> #include <QMenuBar> #include <QToolBar> #include <QLabel> #include <QStatusBar> #include <QDockWidget> #include <QTextEdit> #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { resize(600,400); //包含菜单栏 只能有一个 QMenuBar *bar=menuBar(); //将菜单栏放到窗口中 this->setMenuBar(bar); //创建文件菜单 QMenu *fileMenu=bar->addMenu("文件"); QMenu *editMenu=bar->addMenu("编辑"); // QString str01="文件"; // QMenu *fileMenu=bar->addMenu(str01.toUtf8()); // QString str("文件"); // qDebug()<<str; // qDebug()<<QString::fromUtf8("中文"); // qDebug()<<QString::fromLocal8Bit("中文"); // // ui->label->setText(str); // QMenu *fileMenu=bar->addMenu(str); //添加菜单项 QAction *newAction=fileMenu->addAction("新建"); //添加分割线 fileMenu->addSeparator(); QAction *openAction=fileMenu->addAction("打开"); //工具栏 可以有多个 QToolBar *toolBar=new QToolBar(this); addToolBar(Qt::RightToolBarArea,toolBar);//默认停靠范围 //只允许左右停靠 toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea); //设置浮动 toolBar->setFloatable(false); //设置移动 (总开关) toolBar->setMovable(false); //工具栏添加菜单项 toolBar->addAction(newAction); //添加分割线 toolBar->addSeparator(); toolBar->addAction(openAction); //状态栏 只能由一个 QStatusBar *stBar=statusBar(); setStatusBar(stBar); QLabel *label=new QLabel("提示信息",this); stBar->addWidget(label);//添加提示信息到左侧 QLabel *label2=new QLabel("右侧提示信息",this); stBar->addPermanentWidget(label2); //铆接部件 浮动窗口 可以有多个 QDockWidget *dock=new QDockWidget; //添加铆接部件到窗口中 addDockWidget(Qt::BottomDockWidgetArea,dock); //设置停靠范围 dock->setAllowedAreas(Qt::TopDockWidgetArea|Qt::BottomDockWidgetArea); //核心部件 只能一个 QTextEdit *edit=new QTextEdit;//文本编辑器 setCentralWidget(edit); } MainWindow::~MainWindow() { } |
4、main.cpp
1 2 3 4 5 6 7 8 9 10 11 | #include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } |
一、QMainWindow
QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础,如文本编辑器,图片编辑器等。

5.1 菜单栏
一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下面。
- 创建菜单栏,通过QMainWindow类的menubar()函数获取主窗口菜单栏指针
1 | QMenuBar * menuBar() const |
- 创建菜单,调用QMenu的成员函数addMenu来添加菜单
1 2 3 | QAction* addMenu(QMenu * menu) QMenu* addMenu(const QString & title) QMenu* addMenu(const QIcon & icon, const QString & title) |
- 创建菜单项,调用QMenu的成员函数addAction来添加菜单项
1 2 3 4 5 6 7 8 | QAction* activeAction() const QAction* addAction(const QString & text) QAction* addAction(const QIcon & icon, const QString & text) QAction* addAction(const QString & text, const QObject * receiver, const char * member, const QKeySequence & shortcut = 0) QAction* addAction(const QIcon & icon, const QString & text, const QObject * receiver, const char * member, const QKeySequence & shortcut = 0) |
Qt 并没有专门的菜单项类,只是使用一个QAction类,抽象出公共的动作。当我们把QAction对象添加到菜单,就显示成一个菜单项,添加到工具栏,就显示成一个工具按钮。用户可以通过点击菜单项、点击工具栏按钮、点击快捷键来激活这个动作。
5.2 工具栏
主窗口的工具栏上可以有多个工具条,通常采用一个菜单对应一个工具条的的方式,也可根据需要进行工具条的划分。
-
- 直接调用QMainWindow类的addToolBar()函数获取主窗口的工具条对象,每增加一个工具条都需要调用一次该函数。
- 插入属于工具条的动作,即在工具条上添加操作。
通过QToolBar类的addAction函数添加。
-
- 工具条是一个可移动的窗口,它的停靠区域由QToolBar的allowAreas决定,包括:
- Qt::LeftToolBarArea 停靠在左侧
- Qt::RightToolBarArea 停靠在右侧
- Qt::TopToolBarArea 停靠在顶部
- Qt::BottomToolBarArea 停靠在底部
- Qt::AllToolBarAreas 以上四个位置都可停靠
- 工具条是一个可移动的窗口,它的停靠区域由QToolBar的allowAreas决定,包括:
使用setAllowedAreas()函数指定停靠区域:
setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea)
使用setMoveable()函数设定工具栏的可移动性:
setMoveable(false)//工具条不可移动, 只能停靠在初始化的位置上
5.3 状态栏
-
- 派生自QWidget类,使用方法与QWidget类似,QStatusBar类常用成员函数:
- 状态栏也只能最多有一个
1 2 3 4 5 6 | //添加小部件 void addWidget(QWidget * widget, int stretch = 0) //插入小部件 int insertWidget(int index, QWidget * widget, int stretch = 0) //删除小部件 void removeWidget(QWidget * widget) |
5.4 铆接部件
铆接部件 QDockWidget,也称浮动窗口,可以有多个。
1 2 3 | QDockWidget * dock = new QDockWidget("标题",this); addDockWidget(Qt::LeftDockWidgetArea,dock); dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::TopDockWidgetArea); 设置区域范围 |
5.5 核心部件(中心部件)
除了以上几个部件,中心显示的部件都可以作为核心部件,例如一个记事本文件,可以利用QTextEdit做核心部件
1 2 | QTextEdit * edit = new QTextEdit(this); setCentralWidget(edit); |
5.6 资源文件
Qt 资源系统是一个跨平台的资源机制,用于将程序运行时所需要的资源以二进制的形式存储于可执行文件内部。如果你的程序需要加载特定的资源(图标、文本翻译等),那么,将其放置在资源文件中,就再也不需要担心这些文件的丢失。也就是说,如果你将资源以资源文件形式存储,它是会编译到可执行文件内部。
使用 Qt Creator 可以很方便地创建资源文件。我们可以在工程上点右键,选择“添加新文件…”,可以在 Qt 分类下找到“Qt 资源文件”:

点击“选择…”按钮,打开“新建 Qt 资源文件”对话框。在这里我们输入资源文件的名字和路径:

点击下一步,选择所需要的版本控制系统,然后直接选择完成。我们可以在 Qt Creator 的左侧文件列表中看到“资源文件”一项,也就是我们新创建的资源文件:

右侧的编辑区有个“添加”,我们首先需要添加前缀,比如我们将前缀取名为 images。然后选中这个前缀,继续点击添加文件,可以找到我们所需添加的文件。这里,我们选择 document-open.png 文件。当我们完成操作之后,Qt Creator 应该是这样子的:

接下来,我们还可以添加另外的前缀或者另外的文件。这取决于你的需要。当我们添加完成之后,我们可以像前面一章讲解的那样,通过使用 : 开头的路径来找到这个文件。比如,我们的前缀是 /images,文件是 document-open.png,那么就可以使用:/images/document-open.png找到这个文件。
这么做带来的一个问题是,如果以后我们要更改文件名,比如将 docuemnt-open.png 改成 docopen.png,那么,所有使用了这个名字的路径都需要修改。所以,更好的办法是,我们给这个文件去一个“别名”,以后就以这个别名来引用这个文件。具体做法是,选中这个文件,添加别名信息:

这样,我们可以直接使用:/images/doc-open引用到这个资源,无需关心图片的真实文件名。
如果我们使用文本编辑器打开 res.qrc 文件,就会看到一下内容:
1 2 3 4 5 6 7 8 | <RCC> <qresource prefix="/images"> <file alias="doc-open">document-open.png</file> </qresource> <qresource prefix="/images/fr" lang="fr"> <file alias="doc-open">document-open-fr.png</file> </qresource> </RCC> |
我们可以对比一下,看看 Qt Creator 帮我们生成的是怎样的 qrc 文件。当我们编译工程之后,我们可以在构建目录中找到 qrc_res.cpp 文件,这就是 Qt 将我们的资源编译成了 C++ 代码。