目录
- 一、概述
- 二、菜单栏(QMenuBar)
- 三、工具栏(QToolBar)
- 四、状态栏(QStatusBar)
- 五、浮动窗口
- 六、对话框
一、概述
Qt窗口是通过QMainWindow类来实现的。
QMainWindow是一个为用户提供主窗口程序的类,继承自QWidget类,并且提供了一个预定义的布局。QMainWindow包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个浮动窗口(铆接部件) (dock widgets)、一个状态栏(status bar)和一个中心部件(central widget),它是许多应用程序的基础,如文本编辑器,图片编辑器等。如下图为QMainwindow中各组件所处的位置:
二、菜单栏(QMenuBar)
Qt中的菜单栏是通过QMenuBar这个类来实现的。一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下面。.
菜单栏中包含菜单.菜单中包含菜单项.
实例
代码实现菜单栏
需要注意的是,每个菜单栏选项被点击时,触发信号,QAction::triggred,我们可以用过槽函数实现我们想要的功能
效果
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include<QMenuBar>
#include<QMenu>
#include<QAction>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//创建一个菜单栏
QMenuBar* menuBar = new QMenuBar();
this->setMenuBar(menuBar);
//创建菜单
QMenu* menu_1 = new QMenu("文件");
QMenu* menu_2 = new QMenu("编辑");
QMenu* menu_3 = new QMenu("构建");
//将菜单添加到菜单栏
menuBar->addMenu(menu_1);
menuBar->addMenu(menu_2);
menuBar->addMenu(menu_3);
//创建菜单栏选项
QAction* action_1 = new QAction("新建文件");
QAction* action_2 = new QAction("打开文件");
QAction* action_3 = new QAction("保存文件");
QAction* action_4 = new QAction("退出");
//将菜单栏选项添加到菜单栏
menu_1->addAction(action_1);
menu_1->addAction(action_2);
menu_1->addAction(action_3);
menu_1->addAction(action_4);
//给action添加信号槽函数
connect(action_1,&QAction::triggered,this,&MainWindow::handle);
connect(action_4,&QAction::triggered,this,&MainWindow::close);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::handle()
{
qDebug()<<"new file";
}
代码实现菜单栏,给菜单设置快捷键
添加快捷键的方法很简单,只需要在创建菜单项的时候,菜单项的名字后面加个(&+添加的快捷键即可)
代码实现菜单栏,给菜单选项添加分割
在菜单项之间可以添加分割线。分割线如下图所示,添加分割线是通过QMenu 类提供的addSeparator()函数来实现;
代码实现菜单栏,给菜单选项添加分割
其实就是再一个菜单中使用addMenu继续添加菜单,像是往菜单栏中添加菜单一样
三、工具栏(QToolBar)
工具栏是应用程序中集成各种功能实现快捷键使用的一个区域 。可以有多个,也可以没有,它并不是应用程序中必须存在的组件。它是一个可移动的组件,它的元素可以是各种窗口组件,它的元素通常以图标按钮的方式存在。如下图为工具栏的示意图:
调用QMainWindow类的addToolBar()函数来创建工具栏,每增加一个工具栏都需要调用一次该函数。如添加一个工具栏并加入一个 QAction。
实例:
添加一个工具栏条目
将工具栏停靠左
可以在创建工具栏的同时指定停靠的位置,
也可以通过鼠标移动工具栏位置
通过QToolBar类提供的setAllowedAreas()函数来设置允许停靠的方式。
在创建工具栏的同时,也可以设置工具栏的位置,其默认位置是在窗口的最上面;如上述代码,默认在最上面显示。工具栏允许停靠的区域由QToolBar类提供的allowAreas()函数决定,其中可以设置的位置包括:
- Qt::LeftToolBarArea停靠在左侧
- Qt::RightToolBarArea停靠在右侧
- Qt::TopToolBarArea停靠在顶部
- Qt::BottomToolBarArea 停靠在底部
- Qt::AllToolBarAreas 以上四个位置都可停靠
将一个action同时添加到菜单栏和工具栏
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include<QToolBar>
#include<QMenuBar>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//创建一个菜单栏
QMenuBar* menu = this->menuBar();
this->setMenuBar(menu);
QMenu* menu_1 = new QMenu("文件(&F)");
menu->addMenu(menu_1);
//创建一个工具栏
QToolBar* toolbar = new QToolBar();
this->addToolBar(toolbar);
QAction* action_1 = new QAction("保存");
action_1->setIcon(QIcon(":/new/prefix1/save.png"));
//将选项添加到工具栏
toolbar->addAction(action_1);
//将选项添加到菜单栏
menu_1->addAction(action_1);
}
MainWindow::~MainWindow()
{
delete ui;
}
四、状态栏(QStatusBar)
状态栏和菜单栏一样,如果创建项目的时候勾选了创建 ui 界面,那么就会自动生成一个状态栏。
代码:
实例
在状态栏中左侧添加一个控件
在状态栏中右侧添加一个控件
五、浮动窗口
在Qt中,浮动窗口也称之为铆接部件。浮动窗口是通过QDockWidget类来实现浮动的功能。浮动窗口一般是位于核心部件的周围,可以有多个。
要想给浮动窗口内部添加一些控件,需要创建一个单独的 QWidget ,把要添加的控件加入到 QWidget 中,然后再把这个 QWidget 设置dockWidget 中。
六、对话框
对话框是GUI程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。Qt常用的内置对话框有: QFiledialog (文件对话框)、QColorDialog (颜色对话框)、QFontDialog(字体对话框)、QInputDialog (输入对话框) 和QMessageBox (消息框)
实例
在主窗口中点击按钮弹出对话框
在ui中添加一个按钮,设置对应的槽函数
void MainWindow::on_pushButton_clicked()
{
//创建一个对话框
QDialog* dialog = new QDialog(this);
//调整对话框大小
dialog->resize(400,300);
//设置对话框标题
dialog->setWindowTitle("对话框");
//显示对话框
dialog->show();
//dialog随此Widget生命周期,如果频繁调用此接口,则频繁生成QDialog,会造成内存泄露
dialog->setAttribute(Qt::WA_DeleteOnClose);
}
在主窗口中点击按钮弹出对话框,在对话框中添加一些控件
通过代码方式实现
需要自己实现一个类,在继承QDialog的基础上继续进行扩展
让该类继承QDialog
继续在其构造函数中添加一些控件
效果
通过代码+UI实现
第一步新建文件中点击,一路下一步
生成对应的类和ui文件
在dialog的ui中添加控件
在mainwindow的ui中添加控件
给对应的按钮添加槽函数
效果
模态和非模态
模态对话框指的是:显示后无法与父窗口进行交互,是一种阻塞式的对话框。使用QDialog::exec()函数调用。
模态对话框适用于必须依赖用户选择的场合,比如消息显示,文件选择,打印设置等。
非模态对话框显示后独立存在,可以同时与父窗口进行交互,是一种非阻塞式对话框,使用
QDialog:show()函数调用。
将上述代码的 show 函数改成 exec 函数,就是模态对话框。
运行程序,当窗口弹出后,无法操作父窗口
实例
模态
内置对话框
Qt提供了多种可复用的对话框类型,即Qt标准对话框。Qt 标准对话框全部继承于QDialog类。常用标准对话框如下:
1.消息对话框
消息对话框是应用程序中最常用的界面元素。消息对话框主要用于为用户提示重要信息,强制用户进行选择操作。
QMessageBox类中定义了静态成员函数,可以直接调用创建不同风格的消息对话框,其中包括:
实例
void MainWindow::on_pushButton_clicked()
{
QMessageBox* messagebox = new QMessageBox(this);
messagebox->setWindowTitle("提示");
messagebox->setText("这是提示信息");
messagebox->setIcon(QMessageBox::Warning);
messagebox->setStandardButtons(QMessageBox::Ok|QMessageBox::Cancel);
//添加按钮
//QPushButton* button_1 = new QPushButton(this);
//messagebox->addButton(button_1,QMessageBox::AcceptRole);
//通过exec返回值,可以获取用户点击的
int result =messagebox->exec();
messagebox->setAttribute(Qt::WA_DeleteOnClose);
}
exec 函数是设定对话框是模态对话框,同时它也有一个返回值,返回值就是对话框被选中了哪个按钮的值。
2.颜色对话框
颜色对话框的功能是允许用户选择颜色。继承自QDialog类。
实例
void MainWindow::on_pushButton_clicked()
{
//这个函数静态函数,不必创建对话框对象就可直接使用
QColor color = QColorDialog::getColor(QColor(255,0,0),this,"选择颜色");
qDebug() << color;//这里只是简单答应,可以实现更为复杂的操作
}
3.文件对话框
文件对话框用于应用程序中需要打开一个外部文件或需要将当前内容存储到指定的外部文件。
使用 getOpenFileName 打开文件,getSaveFileName 保存文件。
此处的打开 / 保存的功能是需要我们额外去实现的,这里只是简单介绍一下。
实例
4.字体对话框
Qt中提供了预定义的字体对话框类QFontDialog,用于提供选择字体的对话框部件。
使用 getFont 函数弹出字体对话框
实例
在ui中添加一个button,添加槽函数
void MainWindow::on_pushButton_clicked()
{
bool ok = false;
//静态函数
QFont font = QFontDialog::getFont(&ok);
qDebug()<<"ok = "<<ok;
//输出字体格式
qDebug()<<font.family();
qDebug()<<font.pointSize();
qDebug()<<font.bold();
ui->pushButton->setFont(font);
}
5.输入对话框
Qt中提供了预定义的输入对话框类: QInputDialog, 用于进行临时数据输入的场合。
有 getInt 函数输入一个整数,getDouble 函数输入一个浮点数,getItem 函数输入一个条目,可提前添加条目进行选择
实例
在ui中添加三个button,实现槽函数,该案例只是将获取到数据进行打印,也可实现更复杂的操作
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QInputDialog>
#include<QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
int result = QInputDialog::getInt(this,"整数对话框","请输入一个整数");
qDebug()<<result;
}
void MainWindow::on_pushButton_2_clicked()
{
double result = QInputDialog::getDouble(this,"浮点数对话框","请输入一个浮点数");
qDebug()<<result;
}
void MainWindow::on_pushButton_3_clicked()
{
QStringList items;
items.push_back("1");
items.push_back("2");
items.push_back("3");
QInputDialog::getItem(this,"条目对话框","请输入条目",items);
qDebug()<<items;
}