文章目录
十二、QMainWindow概述
- QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个铆接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget)
- 菜单栏(只能有一个)
- 菜单栏类:QMenuBar
- 除了new,另一种创建菜单栏的方式:通过QMainWindow类的menuBar()函数获取主窗口菜单栏指针
QMenuBar *menubar = menuBar();
- 菜单类:QMenu
- 菜单项:QAciton
#include<QMenuBar> //创建菜单栏 QMenuBar *menubar = new QMenuBar; this->setMenuBar(menubar); //创建菜单 QMenu *menu1 = new QMenu("文件"); QMenu *menu2 = new QMenu("编辑"); QMenu *menu3 = new QMenu("构建"); menubar->addMenu(menu1); menubar->addMenu(menu2); menubar->addMenu(menu3); //创建菜单项 QAction *action1 = new QAction("打开文件"); QAction *action2 = new QAction("另存为"); QAction *action3 = new QAction("关闭文件"); menu1->addAction(action1); menu1->addAction(action2); menu1->addAction(action3);
- 菜单栏类:QMenuBar
- 工具栏(可以有多个)
- 工具栏:QToolBar
- 工具项:QAction
#include<QToolBar> //创建工具栏 QToolBar *toolbar = new QToolBar(this); //将工具栏添加至窗口,并且让其默认悬浮在左侧 this->addToolBar(Qt::LeftToolBarArea,toolbar); toolbar->addAction(action1); toolbar->addAction(action2); toolbar->addAction(action3); //修改工具栏不可移动(默认可上下左右移动) toolbar->setMovable(false); //设置停靠区域(可以在窗口的左侧或者右侧) toolbar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea); //设置工具栏的浮动状态(默认可悬浮窗口) toolbar->setFloatable(false);
- 状态栏(只能有一个)
- 状态栏:QStatusBar
#include<QStatusBar> //创建状态栏 //QStatusBar *statusbar = new QStatusBar(this); QStatusBar *statusbar = statusBar(); this->setStatusBar(statusbar);
- 状态栏信息分类
- 临时信息
- 正式信息(一般在状态栏左侧)
- 永久信息(一般在状态栏右侧)
#include<QStatusBar> //创建状态栏 //QStatusBar *statusbar = new QStatusBar(this); QStatusBar *statusbar = statusBar(); this->setStatusBar(statusbar); //增加临时信息,时间的单位是毫秒 //statusbar->showMessage("页面显示成功",3000); //正式信息(一般位于状态栏的左侧) QLabel *label1 = new QLabel("打开文件",this); QLabel *label2 = new QLabel("www.qf.com"); statusbar->addWidget(label1); //增加正式信息(一般位于状态栏的右侧) statusbar->addPermanentWidget(label2);
- 状态栏信息分类
- 注意:临时信息会覆盖正式信息
- 状态栏:QStatusBar
- 铆接部件(浮动窗口)(可以有多个)
- 铆接部件:QDockWidget
#include<QDockWidget> //创建铆接部件 QDockWidget *dockwidget = new QDockWidget("first",this); this->addDockWidget(Qt::TopDockWidgetArea,dockwidget);
- 核心部件(中心部件)(只能有一个)
- 除了以上部件以外,我们可以创建其他部件作为核心部件
#include<QTextEdit>
//创建核心部件
QTextEdit *textedit = new QTextEdit("文本编辑器",this);
this->setCentralWidget(textedit);
十三、资源文件
- Qt资源系统是一个跨平台的资源机制,用于将程序运行时所需要的资源以二进制的形式存储于可执行文件内部。
- 加载图片:
- 步骤一:右键工程新增资源文件
- 步骤二:给资源文件增加前缀,方便寻找
- 步骤三:给资源文件增加资源
- 步骤四:起别名(选用),方便使用
- 示例:
- 给菜单项加载图片
//给菜单项增加图标信息 //创建一个图标控件 QPixmap pix; //选择图片 pix.load(":/open"); //给菜单项设置图片 action1->setIcon(QIcon(pix));
- 增加背景图
//窗口重新设置大小 this->setFixedSize(800,600); //允许绘制 this->setAutoFillBackground(true); //创建图片控件 QPixmap background = QPixmap(":/open").scaled(this->size(800,600)); //background.load(":/open"); QPalette palette; palette.setBrush(QPalette::Background,QBrush(background)); this->setPalette(palette);
十四、UI
- ui功能:绘制界面(通过拖拽控件)
十五、对话框QDialog
- 概念:对话框是GUI程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序最上层,用于实现断案其任务或者简洁的用户交互。
- QDialog(及其子类,以及所有的Qt::Dialog类型的类)对于其parent指针都有额外的解释:如果parent为NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是parent的中心)。顶层窗口和非顶层窗口的区别在于:顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置。
- 分类:
- 模态对话框,就是会阻塞同一应用程序中其他窗口的输入
- 非模态对话框,在显示对话框的同时,其他的界面可以进行输入
十六、标准对话框
- 概念:Qt中内置的一系列对话框
十七、自定义对话框
- 模态对话框
#include<QDiglog>
QDialog dialog;
dialog.setWindowTitle(tr("Hello,Dialog!"));
dialog.exec();
- 非模态对话框
QDialog *dialog = new QDialog;
//设置自动销毁,有这个不需要手动delete
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->setWindowTitle(tr("Hello,Dialog!"));
dialog->show();
- 注意:
- 对话框创建要在堆上创建
- 由于对话框的特性(无parent),可以设置对话框关闭,自动销毁对话框
十八、文件对话框
- 打开一个文件
#include<QDialog>
#include<QFileDialog>
void MainWindow::on_pushButton_clicked()
{
QString fileName = QFileDialog::getOpenFileName(
this,
tr("打开文件"),
"./",
tr("Images(*.png *.jpg *.xpm);;Text(*.txt)")
);
//参数:父对象指针,文件对话框的标题,打开文件路径,文件过滤器
if(!fileName.isEmpty()){
ui->plainTextEdit->appendPlainText(fileName);
}
}
- 打开多个文件
#include<QDialog>
#include<QDebug>
#include<QFileDialog>
void MainWindow::on_pushButton_2_clicked()
{
//多个文件返回QStringList
QStringList filesName = QFileDialog::getOpenFileNames(
this,
tr("打开文件"),
"./",
tr("Images(*.png *,jpg);;Text(*.txt)")
);
//参数:父对象指针,文件对话框的标题,打开文件路径,文件过滤器
for(int i=0;i<filesName.count();i++){
qDebug()<<filesName.at(i);
}
}
十九、颜色对话框
- QColorDialog::getColor()
//点击按钮,生成颜色对话框,选择颜色,设置为编辑器字体颜色
#include<QColor>
void MainWindow::on_pushButton_3_clicked()
{
//获取现有的调色板数据
QPalette pal = ui->plainTextEdit->palette();
//现有文字颜色
QColor iniColor = pal.color(QPalette::Text);
QColor color = QColorDialog::getColor(iniColor,this,"选择颜色");
//判断选择颜色是否有效
//如果有效,重新设置编辑器的字体颜色
//如果无效,什么都不做
if(color.isValid()){
//设置调色板
pal.setColor(QPalette::Text,color);
ui->plainTextEdit->setPalette(pal);
}
}
- 总结:
- 颜色对话框的使用参考帮助文档
- getColor生成颜色对话框返回值是一个颜色变量,如果在颜色对话框中选择取消,返回值无效,反之有效
二十、字体对话框
- QFontDialog::gerFont生成选择字体的对话框
void MainWindow::on_pushButton_4_clicked()
{
bool ok;
QFont iniFont = ui->plainTextEdit->font();//获取原有的文本框的字体
QFont font = QFontDialog::getFont(&ok,//&ok是逻辑变量
QFont("Times",12),//默认是Times型号,大小为12
this);
if(ok){
//如果ok==true,说明选择字体有效,反之无效
ui->plainTextEdit->setFont(font);
}
}
- 总结:
- 选择字体对话框只用,参考帮助文档
- getFont生成选择字体对话框,不能通过返回值判断是否有效,一般是根据getFont的第一个参数逻辑变量是否为true
二十一、消息对话框
-
拥有的对话框种类
-
示例
void MainWindow::on_pushButton_5_clicked()
{
//错误弹窗
QMessageBox::critical(this,//父类指针
"错误消息对话框",//消息框的标题
"程序出现错误"//消息框中打印的字
);
//警告弹窗
QMessageBox::warning(this,
"警告消息对话框",
"程序出现警告");
//消息弹窗
QMessageBox::information(this,
"消息对话框",
"程序一切正常",
QMessageBox::Ok,QMessageBox::NoButton//可加可不加
);
//消息选择弹窗
QMessageBox::StandardButton result;
result = QMessageBox::question(this,
"消息选择对话框",
"文件已修改,是否保存?",
QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel
);
if(result == QMessageBox::Yes){
qDebug()<<"正在保存";
}
else if(result == QMessageBox::No){
qDebug()<<"不保存";
}
else{
qDebug()<<"取消操作";
}
}
二十二、输入对话框
- QInputDialog:输入文本/整型数据/浮点型数据……对话框
void MainWindow::on_pushButton_6_clicked()
{
//生成输入文字对话框
bool ok;
QString text = QInputDialog::getText(this,
tr("输入文字对话框"),//对话框标题
tr("请输入文字"),//对话框提示文字信息
QLineEdit::Normal,//默认输入
"demo",//在输入框中默认输入的内容
&ok);
if(ok && !text.isEmpty()){
ui->plainTextEdit->appendPlainText(text);
}
}
二十三、布局概述
- Qt提供了两种组件定位机制:绝对定位和布局定位
- 绝对定位:需要提供组件的长、高、坐标值
- 布局定位:需要指定使用哪种布局(垂直,水平,网状,表格)
- 布局分类:
- 系统自带的布局,一般不使用
- 通常使用的是Widget中的4种布局
二十四、布局使用
-
登录界面绘制
-
子窗口界面绘制
-
登录页面->主页面(页面切换功能1)
connect(ui->pushButton,&QPushButton::clicked,this,[=](){
this->hide();
this->new_Window->show();
});
- 主页面->登陆页面(页面切换功能2)
//在from.h中,定义一个信号
signals:
void back(void);
//在From.cpp(子窗口)中,当返回按钮被点击,发出返回信号
connect(ui->pushButton,SIGNAL(clicked(bool)),this,SIGNAL(back()));
//在Widget.cpp(主窗口)中,当接收到了返回信号,子窗口被隐藏,主窗口显示
connect(this->new_Window,&Form::back,this,[=](){
this->show();
this->new_Window->hide();
}
);
二十五、QLabel标签框
- 创建标签:
#include<QLabel>
QLabel *label = new QLabel(this);
- 显示文本(文字、html)
label->setText("这是一个标签");
//也可以显示html
label->setText("<h1><a href=\"www.baidu.com\">百度</a></h1>");
//但是这种超链接点击后是没反应的
//需要手动设置点击链接之后是否自动打开连接
label->setOpenExternaLinks(true);
- 显示图片
#include<QPixmap>
//首先定义QPixmap对象
QPixmap pixmap;
//然后加载图片
pixmap.load(":/image/boat.jpg");
//将图片设置到QLabel中
label->setPixmap(pixmap);
- 显示动图
#inlclude<QMovie>
//创建一个QMovie对象
QMovie *movie = new
//加载动图
QMovie(":/image/mario.gif");
label->setMovie(movie);
//注意要调用start函数才能让gif图动起来
movie->start();
二十六、QLineEdit文本编辑框
- 创建QLineEdit
QLineEdit *lineEdit = new QLineEdit(this);
- 编辑文本框
//获取编辑框中的内容使用text()
lineEdit->text();
//设置编辑框内容
lineEdit->setText("这是一个文本编辑框");
- 设置显示模式
lineEdit->setEchoMode(EchoMode mode);
//模式显示方式,按照输入的内容显示
QLineEdit::Normal
//不显示任何内容,此模式下无法看到用户的输入
QLineEdit::NoEcho
//密码模式,输入的字符会根据平台转换为特殊字符
QLineEdit::Password
//编辑时显示字符否则显示字符作为密码
QLineEdit::PasswordEchoOnEdit
- 设置上下左右空白区域
lineEdit->setTextMargins(100,0,0,0);
//左、上、右、下
void QLineEdit::setTextMargins(int left, int top, int right, int bottom)
二十七、自定义控件
- 自定义控件一般是重复性使用的窗口或者窗口中的模块
- 解决的问题:将许多重复性使用的窗口或者窗口中的模块封装成自定义控件,可以减少创建次数,仅仅创建一次,使用时提升
- 步骤:
- 先创建一个Qt设计师页面,对需要的自定义控件进行排布
- 在需要使用自定义控件的窗口中,找到Container中的Widget,然后对Widget进行提升,提升为自己的自定义控件