QWidget为空窗口,QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar),多个工具栏(tool bars),多个锚接部件(dock widgets),一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础。
菜单栏
#include "mainwindow.h"
#include <QMenuBar>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
this->setFixedSize(600,400);
//创建菜单栏
QMenuBar * menubar = menuBar();//menuBar的返回值是QMenuBar *,需要创建一个来接收
//把菜单栏放在窗口中
setMenuBar(menubar);
//此时仍旧不显示,因为是空的菜单栏,什么也没有
//创建菜单 要包含头文件
menubar->addMenu("文件");
}
MainWindow::~MainWindow() {}
右键addMenu上下文相关帮助查询帮助文档,
使用的这个函数,返回值是QMenu,
所以QMenu * fileName = menubar->addMenu("文件");
//创建菜单栏,菜单栏最多只有一个
QMenuBar * menubar = menuBar();//menuBar的返回值是QMenuBar *,需要创建一个来接收
//把菜单栏放在窗口中
setMenuBar(menubar);
//此时仍旧不显示,因为是空的菜单栏,什么也没有
//创建菜单 要包含头文件
QMenu * fileMenu = menubar->addMenu("文件");
QMenu * editMenu = menubar->addMenu("编辑");
//创建菜单项
fileMenu->addAction("新建");
//在菜单项之间添加分隔符
fileMenu->addSeparator();
fileMenu->addAction("打开");
工具栏
工具栏的区域
//工具栏 可以有多个
QToolBar *toolbar = new QToolBar(this);
addToolBar(Qt::LeftToolBarArea,toolbar);
//设置只允许左右停靠
toolbar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
//设置不允许浮动
toolbar->setFloatable(false);
//工具栏内容
toolbar->addAction("新建");
toolbar->addSeparator();
toolbar->addAction("打开");
//工具栏中添加控件,按钮
QPushButton * button = new QPushButton("工具栏中的按钮",this);
toolbar->addWidget(button);
状态栏
//创建状态栏,最多也只能有一个
QStatusBar * statusbar = statusBar();
//设置到窗口中
setStatusBar(statusbar);
//放标签控件
QLabel * lab1 = new QLabel("提示信息",this);
statusbar->addWidget(lab1);
QLabel * lab2 = new QLabel("右侧提示信息",this);
statusbar->addPermanentWidget(lab2);
铆接部件和中心部件
//铆接部件 (浮动窗口) 可以有多个
QDockWidget * dockwidget = new QDockWidget("浮动",this);
this->addDockWidget(Qt::LeftDockWidgetArea,dockwidget);
//设置后期停靠区域,只允许停靠在左右区域
dockwidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
//设置中心部件 只能有一个
QTextEdit * textedit = new QTextEdit("文本编辑器",this);
this->setCentralWidget(textedit);
运行后生成的窗口为
只能添加一个的函数是set开头,能添加多个的函数是add开头
资源文件添加
尝试使用ui
双击ui文件,进行拖拽控件编辑
菜单栏中的菜单项不能选择中文
因为属性这里
程序中给变量起名字不能出现action+中文的格式,可以在text中修改为中文
进行资源文件添加,给菜单加个图片
在项目同目录下添加一个图片文件,Image文件
然后右键添加新文件-QT-QT Resourse File-选择-起个名字,不要有中文,然后在资源文件中添加前缀,再添加文件,打开项目同目录下的Image选择相应的图片打开,编译后就会显示
复制路径
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//使用添加QT资源 “:+前缀名 + 文件名”
ui->actionnew->setIcon(QIcon(":/new/prefix1/Image/Zombatar_1.jpg"));
}
MainWindow::~MainWindow()
{
delete ui;
}
运行后
第一次添加资源文件时不清楚怎么回事报错:-1: error: [Makefile.Debug:758: debug/qrc_res.o] Error 1
,怎么都找不到原因,后来把原来的资源文件删除后,重新添加了资源文件后可以成功。
对话框
标准对话框
QcolorDialog:选择颜色:
QFileDialog:选择文件或者目录;
QFontDialog:选择字体;
QInputDialoga 允许用户输入一个值,并将其值返回;
QMessageBox 模态对话框,用于显示信息、询间问题等;以
QPageSetupDialog:为打印机提供纸张相关的选项;
QPrintDialog:打印机配置;v
QPxintPrexvenDialog:打印预览;
QProgressDialog:显示操作过程。。
模态和非模态对话框创建
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//点击新建按钮弹出对话框
connect(ui->actionNew,&QAction::triggered,
this,[=](){
//对话框分为模态和非模态,模态对话框,弹出后不可以对其他窗口进行操作
QDialog * dlg1 = new QDialog(this);
dlg1->resize(200,100);
dlg1->exec();//main函数中也有exec,相当于阻塞的功能
});
connect(ui->actionOpen,&QAction::triggered,
this,[=](){
//非模态对话框,弹出后可以对其他窗口进行操作
QDialog * dlg2 = new QDialog(this);
//假如是 QDialog dlg2(this);,变量在栈区,执行完show后就会被释放掉,结果就是会闪一下
dlg2->resize(200,100);
dlg2->show();
//上诉代码有个问题,假如用户一直点打开按钮又关闭,
//会导致 QDialog * dlg2一直在堆区创建,而又没有delete
//有可能造成内存泄漏,可以通过下面代码进行处理
dlg2->setAttribute(Qt::WA_DeleteOnClose);
});
}
消息对话框
//消息对话框
//错误
connect(ui->actionmessage,&QAction::triggered,this,
[=](){
// QMessageBox * messageBox = new QMessageBox;
// messageBox->critical(this,"错误","错误对话框");
//QMessageBox中的critical这些函数是静态成员函数,也可以不创建对象直接使用
QMessageBox::critical(this,"错误","错误对话框");
});
//信息
connect(ui->actioninfo,&QAction::triggered,this,
[=](){
QMessageBox::information(this,"信息","信息对话框内容");
});
//问题
connect(ui->actionquestion,&QAction::triggered,this,
[=](){
if( QMessageBox::question(this,"问题","问题对话框内容",QMessageBox::Ok | QMessageBox::Reset) == QMessageBox::Ok)
//question第四个参数是问题中的按钮,第五个参数是默认关联回车的按键,返回值是QMessageBox::StandardButton ,是第四个参数
{
qDebug()<<"用户按的是ok";
}
else
{qDebug()<<"用户按的是Reset";}
});
//警告
connect(ui->actionwarning,&QAction::triggered,this,
[=](){
QMessageBox::warning(this,"警告","警告对话框内容");
});
其他对话框,颜色,文件,字体
//颜色对话框
connect(ui->actioncolor,&QAction::triggered,this,
[=](){
QColor color = QColorDialog::getColor(QColor(255,0,0));
qDebug()<<"r="<<color.red()<<"g="<<color.green()<<"b="<<color.blue();
});
//文件对话框
connect(ui->actionfile,&QAction::triggered,this,
[=](){
QString str= QFileDialog::getOpenFileName(this,"打开文件","D:\桌面","*.doc");
//参数描述:父类,标题,默认打开路径,过滤文件类型
//返回值是选中文件的路径
qDebug()<<str;
});
//字体对话框
connect(ui->actionfont,&QAction::triggered,this,
[=](){
bool ok;
QFont font = QFontDialog::getFont(&ok,QFont("华文彩云",30),this,"字体对话框");
qDebug()<<"字体:"<<font.family()<<"字号:"<<font.pointSize()
<<"是否加粗:"<<font.bold()
<<"是否倾斜:"<<font.italic();
//这样打印出来的字体是带双引号的,而其他的没带,因为字体返回值是QString,要想不加双引号可以这么做
qDebug()<<"字体:"<<font.family().toUtf8().data()<<"字号:"<<font.pointSize()
<<"是否加粗:"<<font.bold()
<<"是否倾斜:"<<font.italic();
});
登录窗口布局
进入ui界面编辑
登录窗口,类似于qq那样的
拖拽两个标签Label,写“用户名”和“密码”,再拖拽两个Line Edit,登录和退出按钮为Push Button,现在是这样的:
为了对齐
先拖出一个Widget,把用户名和一个Line Edit放进去,点击上面的水平布局
同理再把密码弄一个水平布局,按钮弄一个水平布局,再点最大的窗口进行垂直布局
结果是这样的
按钮可能有点长,可以加个Horizontal Spacer放在按钮的两侧,顶住大窗口的两边
按钮中间也可以加个弹簧,但这样窗口放大,按钮间距也会变大,窗口缩小,按钮间距也会缩小,因此把中间弹簧的属性改为固定值,但用户名和密码的白框不齐,可以加个空格补齐,也可以通过栅格布局
先选中最大的窗口,右键布局,打破布局(分拆布局),然后新拉一个Widget,把用户名和密码加上那两个白框放到Widget中,点击栅格布局,仍有问题,上面两行和两个按钮距离太大,可以选中对应的小窗口右下角的sizePolicy里的垂直策略,选FIxed,最终调整后效果为:
窗口和弹簧之间默认是九个像素的间隙,可以进行修改:
常用控件
按钮组
Tool Button,可以添加一些图片在按钮上
1处是可以选择一些图片,2处可以选择图片和按钮名字的位置关系,后面的autoRaise选中可以让按钮变透明
Radio Button是单选按钮,多个单选按钮可以通过放到Group Box中进行分组,布局之后默认是两个都没选,若想默认选男,需要在代码上进行操作
Check Box多选按钮
多选的信号有继承的也有自己的信号函数
可以看到选中为2,不选中为0,
选中这就可以出现1了,1是半选
ItemWidgets (Item—Based)
基于项目的
List Widget
//利用List Widget写诗
//方法一
QListWidgetItem * item = new QListWidgetItem("锄禾日当午");//一行
//将写的诗放到控件中
ui->listWidget->addItem(item);
//设置诗句的位置
item->setTextAlignment(0x0004);
//方法二
QStringList list;
list<<"锄禾日当午"<<"汗滴禾下土"<<"谁知盘中餐"<<"粒粒皆辛苦";
ui->listWidget->addItems(list);//没法居中
Tree Widget
树控件
// Tree Widget树控件的使用
//设置水平头
ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"英雄简介");
//创建了一个匿名对象
QTreeWidgetItem * item1 = new QTreeWidgetItem(QStringList()<<"坦克");
//添加顶层节点
ui->treeWidget->addTopLevelItem(item1);
QTreeWidgetItem * item2 = new QTreeWidgetItem(QStringList()<<"射手");
ui->treeWidget->addTopLevelItem(item2);
QTreeWidgetItem * item3 = new QTreeWidgetItem(QStringList()<<"法师");
ui->treeWidget->addTopLevelItem(item3);
//追加子节点
QStringList hero1;
hero1 <<"廉颇"<<"三个技能都是霸体";
QTreeWidgetItem * item1_son1 = new QTreeWidgetItem(hero1);
item1->addChild(item1_son1);
Table Widget
//Table Widget
//先设置列数
ui->tableWidget->setColumnCount(3);
//设置水平表头
ui->tableWidget->setHorizontalHeaderLabels(
QStringList()<<"姓名"<<"性别"<<"年龄");
//设置行数
ui->tableWidget->setRowCount(3);
//设置正文
//ui->tableWidget->setItem(0,0,new QTableWidgetItem("李四"));
//循环添加信息
QStringList nameList;
nameList<<"李四"<<"张三"<<"王五";
QList<QString> sexList;//和上面的是一个意思
sexList<<"男"<<"女"<<"男";
for(int i = 0;i<3;i++)
{
int col = 0;//列
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(nameList[i]));
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(sexList.at(i)));
//年龄是int,转为QString
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(QString::number(i+18)));
}
其他
Scrool Area滚动
Tool Box,类似QQ的家人,朋友列表
Tab Widget,类似网页上面不同网页的切换
Stacked Widget 类似QT Creater,左侧区域,欢迎、编辑等等按钮切换不同区域,需要配合按钮使用
connect(ui->PushButton_Scrool,&QPushButton::clicked,this,[=](){
ui->stackedWidget->setCurrentIndex(0);
});
connect(ui->PushButton_Tool,&QPushButton::clicked,this,[=](){
ui->stackedWidget->setCurrentIndex(1);
});
connect(ui->PushButton_Tab,&QPushButton::clicked,this,[=](){
ui->stackedWidget->setCurrentIndex(2);
});
Combo Box 下拉框
//下拉框
ui->comboBox->addItems(QStringList()<<""<<"张三"<<"李四"<<"王五");
//点击李四按钮,会选中在下拉框选中李四
connect(ui->Button_lisi,&QPushButton::clicked,this,[=](){
//法一
//ui->comboBox->setCurrentIndex(2);//索引号类似数组,0 1 2 ,2号
//法二
ui->comboBox->setCurrentText("李四");
});
Lable,标签也可以放图片和动图
//Lable显示图片
ui->label_photo->setPixmap(QPixmap(":/new/prefix1/Image/onep.ico"));
//显示动图,包含#include<QMovie>头文件
QMovie * movie = new QMovie(":/new/prefix1/Image/movie.gif");
ui->label_movie->setMovie(movie);
//播放
movie->start();