简介
-
跨平台的图形界面
-
接口简单
-
容易上手
-
一定程度上简化了内存回收
创建第一个Qt程序
- 点击创建项目,选择项目路径以及给项目起名称
- 名称,不能有中文,不能有空格
- 路径,不能有中文路径
- M默认创建窗口类,myWidget,基类有三种:QWidget,QMainwindow,QDialog
main函数
- QApplication a 应用程序对象,有且只有一个
- myWidget w 实例化窗口对象
- w.show()显示窗口
- return a.exec()让应用程序对象进入消息循环机制中,代码堵塞当前行
命名规范
- 类名 首字母大写,单词和单词之间首字母大写
- 函数名,变量名,首字母小写,单词与单词之间首字母大写
快捷键
- 注释 ctrl+/
- 运行 ctrl+r
- 编译 ctrl+b
- 字体的缩放 ctrl+鼠标的滚轮
- 查找 ctrl+f
- 整行移动 CTRL+shift +上
- 帮助文档 F1
- 自动对齐 ctrl+i
- 同名之间的.h和.cpp切换 F4
帮助文档 第一种方式 F1 第二种方式左侧按钮
按钮控件常用的API
- 创建QPushButton *btn =new QPushButton
- 设置父亲 setParent(this)
- 设置文本 setText(“文字”)
- 设置位置 move(宽,高)
- 重新制定窗口大小 resize,按钮也可以设置固定大小
- 设置窗口标题 setWindowTitle
- 设置窗口的固定大小 setFixedSize
对象树
- 当创建的对象在堆区的时候,指定的父亲是QObject派生下来的类或者QObject子类派生下来的类,可以不用管理释放的操作,将对象会放入到对象树中,
- 一定程度上简化内存回收机制
Qt的窗口坐标系
(0,0)在左上角
x以右为正方向
信号和槽
信号槽的优点,松散耦合,通过connect连接,耦合在一起
//参数1:信号的发送者
//参数2:发送的信号(函数的地址)
//参数3:信号的接收者
//参数4:处理的槽函数(
connect(myBtn,&QPushButton::clicked,this,&myWidget::close);
自定义的信号和槽
自定义信号(写到signal下):只需要声明,不需要实现,可以有参数
自定义槽(写到slot下或者,public,或者全局函数下):需要声明,需要实现,可以有参数,可以重载
触发自定义的信号:emit 自定义的信号
自定义信号和槽出现重载
需要利用函数指针,明确指向函数的地址
void(Teacher:: *teacherSignal)(QString)=&Teacher::hungry;
void(Student:: *studentSlot)(QString)=&Student::treat;
connect(zt,teacherSignal,st,studentSlot);
//QString->char* 先转化成QByteArray(.toUtf8())再转化char*()
qDebug()<<"请老师吃饭,老师要吃 "<< foodName.toUtf8().data();
信号可以连接信号
断开信号连接disconnect
一个信号可以连接多个槽函数
多个信号可以连接同一个槽函数
信号和槽函数的参数类型必须要一致
信号的参数个数可以多于槽函数的个数
Lambda表达式
用于定义并创建一个匿名的函数对象
[]标识符 匿名函数
& 引用传递
{} 实现体
mutable 修饰值传递的变量,可以修改拷贝的数据,改变不了本体
QMainWindow
菜单栏最多只有一个
QMenuBar * bar=Menu bar();
setMenu bar(bar)
QMenu *fileMenu=bar->addMenu(“文件”);
工具栏,可以有多个
QToolBar *toolbar=new QToolBar(this)
//创建一个菜单栏,最多只有一个
QMenuBar * bar=menuBar();
//将菜单栏放到窗口中
setMenuBar(bar);
//创建菜单
QMenu * fileMenu=bar->addMenu("文件");
QMenu * editMenu=bar->addMenu("编辑");
//创建一个菜单项
fileMenu->addAction("新建");
//添加分隔符
fileMenu->addSeparator();
fileMenu->addAction("打开");
//工具栏。可以有多个
QToolBar *toolBar =new QToolBar(this);
addToolBar(Qt::LeftToolBarArea,toolBar);
toolBar->setFloatable(false);
toolBar->addAction("打开1");
QPushButton * btn = new QPushButton("aa",this);
toolBar->addWidget(btn);
状态栏
//状态栏,最多只有一个
QStatusBar * stBar=statusBar();
//设置到窗口中
setStatusBar(stBar);
//放标签控件
QLabel * label = new QLabel("提示信息",this);
stBar->addWidget(label);
QLabel * label2 = new QLabel("右侧提示信息",this);
stBar->addPermanentWidget(label2);
//铆接部件(浮动窗口)
QDockWidget * dockWidge=new QDockWidget("浮动",this);
addDockWidget(Qt::BottomDockWidgetArea,dockWidge);
//设置中心部件 只有一个
QTextEdit * edit=new QTextEdit(this);
setCentralWidget(edit);
资源文件
//ui->actionnew->setIcon(QIcon("F:/anda2.jpg"));
//使用Qt资源
ui->actionnew->setIcon(QIcon(":/image/anda2.jpg"));
将图片文件拷贝到项目下
创建一个新文件,右键项目,Qt下的Qt resouce file 给资源文件起名
使用“:+前缀名+文件名”
对话框
//点击新建,弹出对话框
connect(ui->actionnew,&QAction::triggered,[=](){
//对话框两种分类
//模态对话框(不可以对其他的窗口进行操作),非模态对话框
//模态创建
// QDialog dlg(this);
// dlg.exec();
//非模态创建
QDialog *dlg2 =new QDialog (this);
dlg2->show();
dlg2->setAttribute(Qt::WA_DeleteOnClose);//55号 属性
消息对话框
//消息对话框
//错误对话框
//QMessageBox::critical(this,"cricital","错误");
//信息对话框
//QMessageBox::information(this,"info","信息");
//提问对话框
//参数1:父亲,参数2:标题,参数3:中间显示内容,参数4:按键的类型,参数5:默认关联回车的按键
if(QMessageBox::Yes==(QMessageBox::question(this,"ques","提问"))){
qDebug() <<"选择的yes";
}
//警告对话框
QMessageBox::warning(this,"warning","警告");
//其他标准对话框,颜色对话框
QColor color=QColorDialog::getColor(QColor(255,0,0));
qDebug()<< color;
树控件 QTreeWidget
//treeWidget树控件的使用
//设置水平的头
ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"英雄简介");
QTreeWidgetItem *liitem =new QTreeWidgetItem(QStringList()<<"力量");
QTreeWidgetItem *item2 =new QTreeWidgetItem(QStringList()<<"敏捷");
QTreeWidgetItem *item3 =new QTreeWidgetItem(QStringList()<<"智力");
//加载顶层的节点
ui->treeWidget->addTopLevelItem(liitem);
ui->treeWidget->addTopLevelItem(item2);
ui->treeWidget->addTopLevelItem(item3);
//追加子节点
QStringList h1;
h1<<"猪"<<"吸收伤害";
QTreeWidgetItem *li1 =new QTreeWidgetItem(h1);
liitem->addChild(li1);
QTableWidget表格控件
//TableWidget控件
//设置列数
ui->tableWidget->setColumnCount(3);
//设置水平表头
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄");
//设置行数
ui->tableWidget->setRowCount(5);
//设置正文
//ui->tableWidget->setItem(0,0,new QTableWidgetItem("亚瑟"));
QStringList nameList;
nameList<<"亚瑟"<<"赵云"<<"张飞"<<"关羽"<<"花木兰";
QList<QString> sexList;
sexList<<"男"<<"男"<<"男"<<"男"<<"女";
for(int i=0;i<5;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)));