Qt窗口与对话框开发指南
Qt窗口是通过QMainWindow类来实现的。
QMainWindow是一个为用户提供主窗口程序的类,继承子QWidget类,并且提供了一个预定义布局。QMainWindow 包含 ⼀个菜单栏(menu bar)、多个⼯具栏(tool bars)、多个浮动窗⼝(铆 接部件)(dock widgets)、⼀个状态栏(status bar) 和⼀个 中⼼部件(central widget),它是许多应⽤程序的基础,如⽂本编辑器,图⽚编辑器等。如下图为 QMainwindow 中 各组件所处的位置
菜单栏
Qt中的菜单栏是通过QMenuBar这个类来实现的。一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下面。
创建菜单栏
方式一:菜单栏的创建可以借用QMainWindow类提供的menuBar()函数来实现。
方式二:在堆上动态创建
使用setMenubar吧菜单放到窗口中
在菜单栏中添加菜单
创建菜单,并通过QMenu提供的addMenu()函数来添加菜单。
创建菜单项
在Qt中,并没有专门的菜单项类,可以通过QAction类,抽象出公共的动作。如在菜单中添加菜单项。
在菜单项之间添加分割线
在菜单项之间可以添加分割线。添加分割线是通过QMenu类提供的addSeparator()函数实现的
综合实例
在窗口上创建一个菜单栏,在菜单栏中添加一些菜单,在某一个菜单中添加一些菜单项
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTextEdit>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 设置标题this->setWindowTitle("我的记事本");// 创建菜单栏QMenuBar* menubar = new QMenuBar(this);this->setMenuBar(menubar);// 创建菜单QMenu* menu = new QMenu("文件");menubar->addMenu(menu);// 创建菜单项QAction* action1 = new QAction("保存");QAction* action2 = new QAction("加载");menu->addAction(action1);menu->addAction(action2);connect(action1,&QAction::triggered,this,&MainWindow::save);connect(action2,&QAction::triggered,this,&MainWindow::load);// 创建中央控件QTextEdit* edit = new QTextEdit(this);this->setCentralWidget(edit);edit->setPlaceholderText("请在此处输入内容");}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::save()
{// 进行某些操作
}void MainWindow::load()
{// 进行某些操作
}
工具栏
创建工具栏
调佣QMainWindow类的addToolBar()函数来创建工具栏,每增加一个工具栏都需要调用一次函数
如添加两个工具栏
设置停靠位置
工具栏停靠位置的设置有两种方式。一种是在创建工具栏的同时指定停靠的位置,另一种是通过QToolBar类提供的setAllowAreas()函数来设置
方式一:创建工具栏的同时指定其停靠的位置
在创建工具栏的同时,也可以设置工具栏的位置,其默认的位置是在窗口的最上面
方式二:使用QToolBar类提供的setAllowedAreas()函数设置停靠位置
设置浮动属性
工具栏的浮动属性可以通过QToolBar类提供的setFloatable()函数来设置、setFloatable()函数原型为:
void setFloatable(bool floatable)
参数:
true 浮动
false 不浮动
设置移动属性
设置好工具栏的移动属性可以通过QToolBar类提供的setMovable()函数来设置。setMovable()函数原型为
void setMovable(bool movable)
参数:
true 移动
false 不移动
如果设置工具栏位不移动的状态,则设置其停靠位置的操作就不会生效,所有设置工具栏的移动属性类似于总开关的效果。
综合实例
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QToolBar>
#include <QPushButton>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 设置窗口的大小resize(800,600);QToolBar* toolbar = new QToolBar(this);// 设置工具栏的位置,默认是在窗口上方,此处设置为左侧addToolBar(Qt::LeftToolBarArea,toolbar);// 设置工具栏只允许停靠在左侧或者右侧toolbar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);// // 设置浮动属性toolbar->setFloatable(false);// // 设置移动属性toolbar->setMovable(true);// 设置工具栏的内容QAction* action1 = new QAction("open",this);QAction* action2 = new QAction("new",this);toolbar->addAction(action1);toolbar->addSeparator();toolbar->addAction(action2);QPushButton* btn = new QPushButton("请点击我",this);toolbar->addWidget(btn);
}MainWindow::~MainWindow()
{delete ui;
}
状态栏
- 实时消息:如当前程序的状态
- 永久消息:程序版本号,机构名称
- 进度消息:如进度条提示,百分百提示
状态栏的创建
状态栏的创建是通过QMainWindow类提供的statusBar()函数来创建的
在状态栏中显示实时消息
在状态栏中显示实时消息时通过showMessage()函数来实现的
在状态栏中显示永久消息
在状态栏中可以显示永久消息,此处的永久消息时通过标签来显示的
天正显示的消息的位置
浮动窗口
在Qt中,浮动窗口也称之为铆接部件。浮动窗口通过QDockWIdget类来实现浮动的功能。浮动窗口一般是位于核心部件的周围,可以有多个。
浮动窗口的创建
浮动窗口的创建是通过QDockWidget类提供的构造方法QDockWidget()函数动态创建的
设置停靠的位置
浮动窗口是位于中心部件的周围。可以通过QDockWidget类中踢动setAllowedAreas()函数设置其允许停靠的位置。
对话框
对话框介绍
对话框时GUI程序中一个不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。Qt常用的内置对话框有:QFiledialog(⽂件对话框)、QColorDialog(颜⾊对话框)、QFontDialog(字体对话框)、QInputDialog (输⼊对话框)和 QMessageBox(消息框)
对话框的分类
对话框分为模态对话框和非模态对话框
模态对话框
非模态对话框
混合属性对话框
Qt内置对话框

消息对话框QMessageBox

颜色对话框 QColorDialog

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QPushButton>
#include <QColorDialog>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);resize(800,600);QPushButton* colorButton = new QPushButton("选择颜色",this);// 创建颜色对话框QColorDialog* colorDialog = new QColorDialog(this);connect(colorButton,&QPushButton::clicked,this,[=](){QColor color = colorDialog->getColor(QColor(255,0,0));qDebug()<<color.red();qDebug()<<color.green();qDebug()<<color.blue();});
}MainWindow::~MainWindow()
{delete ui;
}
文件对话框 QFileDialog
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QPushButton>
#include <QFileDialog>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* btn = new QPushButton("文件",this);connect(btn,&QPushButton::clicked,this,[=](){QString path =QFileDialog::getOpenFileName(this,"文件","F:/封面","*.jpg");qDebug()<<path;});
}MainWindow::~MainWindow()
{delete ui;
}
字体对话框QFontDIalog
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QPushButton>
#include <QFontDialog>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* btn = new QPushButton("文字",this);connect(btn,&QPushButton::clicked,this,[=](){bool flag;QFont font = QFontDialog::getFont(&flag,QFont("华文行楷",36));qDebug()<<font.family();qDebug()<<font.pointSize();qDebug()<<font.bold();qDebug()<<font.italic();});
}MainWindow::~MainWindow()
{delete ui;
}
输入对话框QInputDialog
Qt中提供了预定义的输入对话框类:QInputDialog,用于临时数据输入的场合
1. 双精度浮点型输入数据对话框:getDouble
2. 整型输入数据对话款:getInt
3. 选择条目型输入数据框:getItem
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QPushButton>
#include <QInputDialog>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* btn = new QPushButton("输入框",this);connect(btn,&QPushButton::clicked,this,[=](){QStringList items;items<<tr("spring")<<tr("summer")<<tr("Fall")<<tr("winter");QString item = QInputDialog::getItem(this,"输入框","item",items);qDebug()<<item;});
}MainWindow::~MainWindow()
{delete ui;
}