QT学习日记
一.QWidget
版本选择:win下选择MINGW (编码UTF-8)
选择Qwidget之后勾选mingw不然会报错
初识main.cpp
详解:
#include "widget.h" #include <QApplication> //main程序入口 int main(int argc, char *argv[]) {
///应用程序对象,只有一个 QApplication a(argc, argv); //窗户对象Widgt继承父类QWidget Widget w; //show方法 w.show(); ///消息循环不会结束 return a.exec(); }
pro文件解释
//QT的核心模块 QT = core gui //大于4以上才有widgets版本 greaterThan(QT_MAJOR_VERSION, 4): QT = widgets //目标文件 TARGET = Demo01 //模板--application TEMPLATE = app DEFINES = QT_DEPRECATED_WARNINGS CONFIG = c 11 //源文件 SOURCES = \ main.cpp \ widget.cpp //头文件 HEADERS = \ widget.h FORMS = \ widget.ui # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS = target
命名规范
类名:首字母大写,单词和单词直接首字母大写
函数名:首字母小写、单词和首字母大写[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-2wMnlWjO-1617466776739)(Lily_Screenshot_1608472881.png)]
查找ctrl f
自动对齐Ctrl i
同名.h和.cpp切换f4
写代码了
QPushButton *button =new QPushButton(); //以顶层弹出 //button->show(); //让button依赖在Widget中显示,setParent设置父窗 button->setParent(this); ///这个设置应该在下面,这是底层的问题 ui->setupUi(this);
带参数构造
发现与原按钮重叠
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-u7SEwuVW-1617466776741)(Lily_Screenshot_1608474766.png)]
//窗户固定大小 setFixedSize(600,400);
指定父类将子类添加到对象树中,以便在分析时释放象树
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bRrEnGG9-1617466776745)(image-20201220232553431.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tpybSAjz-1617466776747)(image-20201220235015356.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tNcLMhHi-1617466776749)(image-20201220234957297.png)]
坐标体系
左上角向下y向右x
信号和槽
信号的处理(槽函数)
优点:接受和发送没有关联
1.实现功能点击按钮关闭窗口
//设置按钮button2关闭窗口
connect(button2,& QPushButton::clicked , this , & QWidget::close);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8r3KG4v6-1617466776750)(image-20201221123927942.png)]
自定义信号
信号在建立类之后会有,默认继承Qobject类不用释放
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HZltgUkY-1617466776752)(image-20201221131238328.png)]
signals:
//只要声明不用实现
//返回一个void就行
void classover();
自定义槽
#include "student.h"
#include<QDebug>
Student::Student(QObject *parent) : QObject(parent)
{
}
void Student::Food()
{
qDebug()<<"下课吃饭了";
}
在widget的头文件里面写入private的对象
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include"teacher.h";
#include"student.h";
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
Teacher *teacher;
Student *student;
connect(zyq,&Teacher::classover,lpy,&Student::Food);
Classover();
}
Widget::~Widget()
{
delete ui;
}
void Widget::Classover(){
//触发下课的信号
emit zyq->classover();
}
};
先创建对象,再建立连接,最后调用函数触发信号( emit zyq->classover();)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WrSjy6vg-1617466776753)(image-20201221234232202.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2zMirtRv-1617466776754)(image-20201221234547927.png)]
qDebug()<<“XXX is sb”
//重载函数后,连接会不明确指向的是哪个函数,需要手动void 一个地址
void (Teacher::*tea)(QString)=&Teacher::classover;
void (Student:: *stu)(QString)=&Student::Food;
connect(zyq,tea,lpy,stu);
Classover();
string转换为 char * (utf-8.data)
qDebug()<<"老师要吃"<<FoodName.toUtf8().data();
信号连接信号
//无参信号和槽连接
void (Teacher:: *teaSignal(void)=&Teacher::classover;
void (Student:: *stuSlot)(void)=&Student::Food;
connect(zyq,teaSignal,lpy,stuSlot);
//信号连接信号
connect(button,&QPushButton::clicked,zyq,teaSignal);
//断开连接
disconnect(zyq,teaSignal,lpy,stuSlot);
拓展
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-udkJ10Xs-1617466776755)(image-20201222151936461.png)]
Lambda表达式
[button](){
button->setText("aaaaa");
}();
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dplr0Dpd-1617466776756)(image-20201222154708320.png)]
mutable声明修改只读状态,并且只修改拷贝的值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nnTw6jhb-1617466776757)(image-20201222160024268.png)]
建立连接
void (Teacher:: *tea)(QString)=&Teacher::classover;
void (Student:: *stu)(QString)=&Student::Food;
connect(zyq,tea,lpy,stu);
//使用lambda表达式关闭窗口
QPushButton *btn=new QPushButton("close",this);
connect(btn, &QPushButton::clicked, this, [this](){
this->close(); }
emit zyq->classover("cc");
);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YJOfsYOT-1617466776758)(image-20201222185244348.png)]
二.QMainWindow
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gaJeOM8z-1617466776759)(image-20201222183411211.png)]
1.菜单项目
//创建菜单MenuBar
QMenuBar *bar= menuBar();
//放入窗口
//包含头文件 #include<QMenuBar>
setMenuBar(bar);
//创建菜单
QMenu *menu01= bar->addMenu("病人名单");
QMenu *menu02= bar->addMenu("医生名单");
QMenu *menu03= bar->addMenu("病例记录");
QMenu *menu04= bar->addMenu("太平间记录");
//创建菜单项
menu01->addAction("许音");
menu01->addAction("张雅");
//分隔符
menu01->addSeparator();
menu01->addAction("红衣");
menu01->addAction("高枝");
2.添加工具栏
//Location
Constant
Value
Qt::LeftToolBarArea
0x1
Qt::RightToolBarArea
0x2
Qt::TopToolBarArea
0x4
Qt::BottomToolBarArea
0x8
Qt::AllToolBarAreas
ToolBarArea_Mask
Qt::NoToolBarArea
0
//添加工具栏
QToolBar *toolbar=new QToolBar(this);
addToolBar(Qt::RightToolBarArea,toolbar);
//只允许左右停靠
toolbar->setAllowedAreas(Qt::RightToolBarArea | Qt::LeftToolBarArea);
//设置浮动
toolbar->setFloatable(true);
//设置移动(权值大于前面)
toolbar->setMovable(false);
// 设置action
toolbar->addAction(xuyin);
toolbar->addAction(zhangya);
toolbar->addSeparator();
QPushButton *btn=new QPushButton("destroy",this);
toolbar->addWidget(btn);
3.状态栏
//状态栏
QStatusBar *Qsta=new QStatusBar();
//加入窗口
setStatusBar(Qsta);
//设置左侧提示
QLabel *x=new QLabel("恐怖屋");
Qsta->addWidget(x);
//设置右侧提示
QLabel *y=new QLabel("第三病栋");
Qsta->addPermanentWidget(y);
qt太多要记的了5555
4.浮动窗口
//floatWidget
QDockWidget *dock=new QDockWidget("show memory",this);
addDockWidget(Qt::TopDockWidgetArea,dock);
dock->setAllowedAreas(Qt::BottomDockWidgetArea | Qt::TopDockWidgetArea);
5.设置核心部件
//设置central widget(有且只有一个)
QTextEdit *textedit=new QTextEdit(this);
setCentralWidget(textedit);
6.总结
只有一个的用set,能有多个的是add
三。图形化学习
3.1.设置图标
ui->setupUi(this);
ui->actionnew->setIcon(QIcon("D:\\QTimage\\zhangya.jpg"));
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5rgM0ZHu-1617466776760)(image-20201223221328068.png)]
有手就行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U2BcF4yO-1617466776761)(image-20201223222355484.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EZ8AR6tZ-1617466776762)(image-20201223223251227.png)]
新版只需要去图片那里复制路径即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-akUrQTQw-1617466776763)(image-20201223223610985.png)]
3.2 对话框 (模态与非模态)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kQFDsd0G-1617466776764)(image-20201223233707116.png)]
//阻塞的模态,非模态(可对其他窗口操作)
connect(ui->actionnew,& QAction::triggered,[=](){
// QDialog dia(this);
// dia.resize(200,200);
// dia.exec();
// qDebug()<<"dialog finished";
//非模态(可对其他窗口操作)
QDialog *dia2=new QDialog(this);
//这个如果不释放主窗口就不会释放,会不停的泄露内存
dia2->show();//只是闪一下
dia2->resize(200,200);
qDebug()<<"dialog finished";
});
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dgpBnQuZ-1617466776765)(image-20201224000248780.png)]
//这个如果不释放主窗口就不会释放,会不停的泄露内存需要删除时候释放
dia2->setAttribute(Qt::WA_DeleteOnClose);//55号属性
3.3标准对话框(重点)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yTHLdDPm-1617466776766)(image-20201224151059674.png)]
//标准对话框
// QMessageBox::critical(this,"critical","error404");
//参数一:父亲窗口,参数二:标题,参数三:提示内容 参数四 按键类型 参数五:默认关联回车按钮
QMessageBox::question(this,"请问要保存吗","该操作不可逆转",QMessageBox::Save |QMessageBox::Cancel,QMessageBox::Cancel );
//按下save保存
if(QMessageBox::Save==QMessageBox::question(this,"请问要保存吗","该操作不可逆转",QMessageBox::Save |QMessageBox::Cancel,QMessageBox::Cancel ))
{
qDebug()<<"save";
}
else {
qDebug()<<"cancel";
}
//颜色对话框
QColorDialog::getColor(QColor(255,0,0));
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YPLEtmEO-1617466776767)(image-20201224153951175.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jdc7heUe-1617466776768)(image-20201224154253938.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b1HNgr3K-1617466776769)(image-20201224154424246.png)]
图形化界面:弹簧,widget的栅栏布局,widget要选垂直策略 fixed
3.4 Toolbar实现早期qq的聊天好友
设置按钮默认选中
ui->sexbtnman->setChecked(true);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z3qCrtpX-1617466776770)(image-20201224235043761.png)]
checkbox默认值
半选状态(tristate)
3.4QListWidget
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XEgwb3rS-1617466776771)(image-20201225171203913.png)]
字符串方法
QStringList string;
string<<"aaa"<<"ksk";
ui->list->addItems(string);
3.4QTreeWidget
ui->tree->setHeaderLabels(QStringList()<<"ghost"<<"ability");
//父节点
QTreeWidgetItem *zy=new QTreeWidgetItem(QStringList()<<"张雅");
QTreeWidgetItem *zw=new QTreeWidgetItem(QStringList()<<"张雅");
QTreeWidgetItem *zi=new QTreeWidgetItem(QStringList()<<"张雅");
QTreeWidgetItem *zo=new QTreeWidgetItem(QStringList()<<"张雅");
//加入treewidget
ui->tree->addTopLevelItem(zy);
ui->tree->addTopLevelItem(zi);
ui->tree->addTopLevelItem(zw);
ui->tree->addTopLevelItem(zo);
//子节点的加入
QTreeWidgetItem *ch=new QTreeWidgetItem(QStringList()<<"张雅");
zy->addChild(ch);
3.5Qtablewidget
//表单窗体
ui->table->setColumnCount(3);
ui->table->setRowCount(3);
ui->table->setHorizontalHeaderLabels(QStringList()<<"ghost"<<"sex"<<"age");
QStringList ghost;
ghost<<"zy"<<"xy"<<"xx";
QStringList sex;
sex<<"xx"<<"xy"<<"xx";
QStringList age;
age<<"zy"<<"xy"<<"xx";
for (int i=0;i<3;i++) {
for (int j=0;j<3;j++)
{
if(j==0)
ui->table->setItem(i,j,new QTableWidgetItem(ghost[i]));
else if(j==1)
ui->table->setItem(i,j,new QTableWidgetItem(sex[i]));
else
ui->table->setItem(i,j,new QTableWidgetItem(age[i]));
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zZbfm0M0-1617466776772)(image-20201225182435210.png)]
3.6.。jpg和gif添加
//textlabal,jpg,添加
ui->pic->setPixmap(QPixmap(":/QTimage/tank.jpg"));
QMovie *mo=new QMovie(":/QTimage/sisi.gif");
//gif添加
ui->gif->setMovie(mo);
mo->start();
3.7自定义组件
设计师界面加好,然后主界面添加那个类然后提升为那个类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bHSHdsKQ-1617466776773)(image-20201226004745735.png)]
qt的占位符号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LW5aycf0-1617466776773)(Lily_Screenshot_1608916724.png)]
还有个global是基于屏幕的x,y
左右键和滚轮的自定义函数
还有buttons的组合键位操作,,,不重要,用位操作实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pxR5Tj9v-1617466776774)(image-20201226012422798.png)]
#include<QMouseEvent>
void myLabel::enterEvent( QEvent *event)
{
qDebug()<<"enter";
}
void myLabel::leaveEvent( QEvent *)
{
qDebug()<<"leave";
}
void myLabel::mouseMoveEvent( QMouseEvent *event)
{
QString str=QString("move to x :%1 y : %2 Global x: %3 y:%4").arg(event->x()).arg(event->y()).arg(event->globalX()).arg(event->globalY());
qDebug()<<str;
}
//设置鼠标追踪
setMouseTracking(true);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xHavrNFb-1617466776775)(image-20201226014355595.png)]
3.8TIMEevent
方法一:重写一个timerevent,然后在函数里面调用一下
void Widget::timerEvent(QTimerEvent *) { static int num=1; ui->lablel2->setText(QString::number(num++)); } if (ev->timerId()==id1){ static int num=1; ui->lablel2->setText(QString::number 标签:
ha重载矩形连接器