一、基础知识点
- QT的优点:跨平台,接口简单/多,简化了内存回收机制(对象树)
- 注意点: 项目名称不能有空格和中文,不能有中文路径
- QT使用c++面向对象编程,有创建窗口三大基类:QWidget(空白窗口)、QMainWindow(有菜单栏工具栏等窗口)、QDialog(对话框)
- Main函数中,
QApplication a;
MyWidget w;
w.show();
return a.exec();
- .pro文件中
QT += core gui
TARGET = 01_QtFirst
SOURCES += main.cpp\
HEADERS += mywidget.h
- 对象树:当创建的对象 指定的父亲是由QObject或者Object派生的类时候,这个对象被加载到对象树上,当窗口关闭掉时候,树上的对象也都会被释放,构造函数的e传递则是挂载在对象树上
- Qt中信号和槽
·信号: 返回值是void+只需声明不需要实现+可以重载
·槽函数: 返回值是void+需声明也需要实现+可以重载
·当信号和槽发生重载时候,需要利用函数指针明确指出函数地址: void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;
teacherSignal替代下方的 &MyPushButton::clicked
·connect ( 信号的发送者,发送的信号,信号的接受者,处理的槽函数)
connect( myBtn , &MyPushButton::clicked ,this, &MyWidget::close);
·可以断开信号和槽 disconnect
·信号和槽函数的参数类型 必须一一对应,信号的参数个数 可以多余槽函数的参数个数,反之不可以 , 参数类型要一一对应
·Lambda表达式可做槽函数
[=]() -> type {}
二、小技巧
- 将QString 转为 char *: .toUtf8().data()
三、常用类(头文件)\事件\定时器\画家\文件管理
- QPushButton 父类是QAbstractButton 再父类是QWidget
QPushButton * btn = new QPushButton;
btn->setParent(this);
setText
move
resize
setFixedSize
setWindowTitle
- MainWindow
QMenuBar* bar = menuBar()
setMenuBar(bar) ;设置到窗口中
QMenu* menu = bar->addMenu(“文件”)
QAction * newAction = menu->addAction(“新建”);
fileMenu->addSeparator();
QToolBar* toolbar = new QToolBar();
addToolBar(Qt::LeftToolBarArea,toolbar)
QStatusBar * stBar = statusBar();
setStatusBar(stBar);
stBar->addWidget(label1);
stBar->addPermanentWidget(label2);
QDockWidget * dockWidget = new QDockWidget;
addDockWidget(Qt::BottomDockWidgetArea,dock);
dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
setCentralWidget(edit);
- QDialog(对话框)
QDialog dlg(this);
QDialog * dlg2 = new QDialog(this);
dlg.exec();
QDialog * dlg2 = new QDialog(this);
dlg2->show();
dlg2->setAttribute(Qt::WA_DeleteOnClose);
- QMessageBox(标准对话框) 继承了QDialog
QMessageBox::Save == QMessageBox::question(this,"询问","question" , QMessageBox::Save | QMessageBox::Cancel ,QMessageBox::Cancel)
QColor color = QColorDialog::getColor(Qt::red);
QString fileName = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\zhangtao\\Desktop","(*.doc)");
QFont font = QFontDialog::getFont(&flag,QFont("华文彩云",36));
qDebug() << "字体" << font.family().toUtf8().data() << "字号"<< font.pointSize()<< "是否加粗"<<font.bold() << "是否倾斜" << font.italic();
- 鼠标常用事件
EnterEvent
LeaveEvent
MousePressEvent
MouseReleaseEvent
MouseMoveEvent
if(ev->button()==Qt::LeftButton)
ev->x() ev->y()
if(ev->button()&Qt::LeftButton)
setMouseTracking(true)
- 定时器
定时器事件: 第一种定时器不推荐,省略
QTimer * timer1 = new QTimer(this);
timer1->start(x毫秒)
connect(timer1,&QTimer::timeout,[=](){})
timer1->stop();
- 事件管理
事件分发器: 我们自己比较少去用他,知道事件是由他分发的,可以拦截,但不随意用
用途:用于分发事件
原型 bool event(QEvent * e);
if(e->type()==QEvent::MouseButtonPress)
返回值如果是 true代表用户自己处理事件,不再向下分发
其他的事件交给父类
return QLabel::event(e)
事件过滤器: 更高级
ui->label->installEventFilter(this);
bool Widget::eventFilter(QObject * obj , QEvent * e)
- QPainter绘图
绘图事件 void paintEvent(QPaintEvent *);
创建画家 QPainter painter( this )
画线、圆、矩形、文字
设置画笔 QPen painter.setPen() 设置笔宽度、风格
设置画刷 QBrush painter.setBrush() 设置画刷风格
绘图高级设置
painter.setRenderHint(QPainter::Antialiasing);
painter.translate(100,0);
painter.save();
painter.restore();
painter.drawPixmap(posX,0,QPixmap(":/Image/Luffy.png"));
手动调用绘图事件
1update()
绘图设备
QPixmap 对不同的平台显示做了优化
QImage 可以对像素级进行访问
QPicture 记录和重新绘图指令
- 文件读写
读文件
QFile file(文件路径)
file.open 指定打开方式 QIODevice::ReadOnly
利用 file.readAll一次性全部读取
利用 file.readLine 按行读取
file.close 关闭文件对象
QTextCodec * codec = QTextCodec::codecForName("gbk");
codec->toUnicode(array)
写文件
QFile file(路径)
file.open(QIODevice::Append);
file.write("啊啊啊啊!");
file.close();
- 文件信息类
QFileInfo info(路径)
info获取文件信息.
后缀名: suffix 文件大小 size 文件名 filename 文件路径 filePath
创建日期 created 修改日期 lastModify
QDateTime 需要用 toString转为自己制定的输出格式
四、操作
- 添加资源文件 .qrc
- 界面布局 勾上新建的.u
常用控件
QPushButton 最常用按钮,里面可以加图片
QToolButton 工具按钮 用于显示图片
toolButtonStyle 设置显示图片和文件
autoRaise透明凸起效果
RadioButton 单选按钮
默认选中 setChecked(true)
QCheckBox 复选按钮
stateChanged 信号
未选中
半选中
选中
QListWidget
创建项 QListWidgetItem * item = new QListWidgetItem("锄禾日当午");
将项加载到 控件中
ui->listWidget->addItem(item);
设置对齐方式 item->setTextAlignment(Qt::AlignHCenter);
ui->listWidget->addItems(list); 可以一次性放入所有内容
QTreeWidget 树控件
设置头
ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"英雄简介");
创建根项目
QTreeWidgetItem * liItem = new QTreeWidgetItem(QStringList()<<"力量");
将根项目添加到树控件中
ui->treeWidget->addTopLevelItem(liItem);
挂载子项目
QTreeWidgetItem * l1 = new QTreeWidgetItem(heroL1);
liItem->addChild(l1);
QTableWidget 表格控件使用
设置列 ui->tableWidget->setColumnCount(3);
设置水平表头 ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄");
设置行数 ui->tableWidget->setRowCount(5);
设置正文
ui->tableWidget->setItem(行,列 , new QTableWidgetItem(“字符串”));`
其他常用控件
栈控件
ui->stackedWidget->setCurrentIndex(0);
切换栈显示内容
下拉框
ui->comboBox->addItem("奔驰");
设置选中
ui->comboBox->setCurrentIndex(2);
ui->comboBox->setCurrentText("拖拉机");
显示图片
ui->label_img->setPixmap(QPixmap(":/Image/butterfly.png"));
QLabel显示gif图片
QMovie * movie =new QMovie(":/Image/mario.gif");
ui->label_movie->setMovie(movie);
movie->start();
自定义控件封装
右键项目-添加新文件
Qt-Qt设计师界面类
在ui文件中设计自定义控件
在主窗口中 拖拽 Widget做提升的操作
在自定义控件中 封装对外接口
SpinBox和 slider控件交互
getData获取显示数字
setData设置数字