qt学习
Q_OBJECT
允许使用信号和槽的机制
1 2
| myWidget(QWidget *parent=nullptr);//有参构造函数
|
命名规范
类名 首字母大小,单词和单词之间首字母大写
函数名 变量名称 首字母小写,单词和单词之间首字母大小
快捷键

1 2 3 4 5 6 7 8 9 10 11 12 13
|
ctrl +/ 运行ctrl + r 编译ctrl + b 字体缩放ctrl +鼠标滚轮 查找ctrl + f 整行移动ctrl + shift +:或者↓ 帮助文档F1 自动对齐ctrl + i 同名之间的.h和.cpp切换F4
|
Qlabel使用
1 2 3 4 5 6 7 8 9 10
| QLabel *label =new Qlabel(widget) Label->setTxet("文字") Label->setAlignemt(QT::AlignCenter) QFont font("文字类型",字号,QFont::Bold,true); label->setFont(font) label->setStyleSheet("color:red") label->setStyleSheet("image:url(路径)") QPixmap pix("绝对路径"); label->setPixmap(pix); label->setScaledContents(true)
|
1 2 3 4 5 6 7 8 9 10
| QPushButton *btn=new QPushButton; btn->setparent() btn->setText("") btn->resize(); btn->move(); setWindowTitle(); setFixedSize()
|
信号量和槽函数
1 2 3 4 5 6 7 8 9 10
| QPushButton *btn =new QPushButton("wenz1",this); 设置窗口大小 resize(600,400); btn->move(宽,高); 设置窗口标题 setWindowTitle("sjj"); 设置固定窗口大小 setFixedSize(600,400); 按钮大小设置 btn->resize();
|
对象模型(对象树)

制动调用析构函数,对象树可以直接递归释放。
qt坐标系从左到右x,从上到下y轴
信号量和信号槽
跟着父类找到槽函数
1 2 3 4 5 6 7 8 9 10
| connect(信号发送者,SIGNAL发送的具体信号,信号的接收,Slot()信号处理 槽)//类型不做比较 connect(信号发送者,SIGNAL发送的具体信号,信号的接收,Slot()信号处理 槽) QPushButton SIGNAL: pressed()//挤压 clicked(), released(), toggled(); Qwidget slot close hide;
|
自己定义信号量和槽
1 2 3 4 5 6 7
| signal:
void hungry(); public slots: 返回void ,有参数,有值,有返回 列子:
|
自定义的信号和槽发生重载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| signal:
public slots: 返回void ,有参数,有值,有返回 列子:老师 下课 学生请老师吃饭 信号与槽; 老师 signal: void class(); void class(QString str); 学生 public slots: void eat(); void eat(QString str); void studnet::eat() { qDubeg<<"eat"; } .h public: void sprint(); private: student *st; teacher *te; .cpp this->st=new student(this); this->te =new teacher(this); 重载情况 指针->地址 void(student:: *studentslot)(QString)=&student::eat; void(teacher:: *teachersignal)(QString)=&teacher::class; connect(te,teachersignal,st,studentslot); sprint();
void ::sprint() { emit te->class("123"); }
void(teacher:: *teachersignal)(QString,int)=&teacher::class;
信号连接信号 void(student:: *studentslot)(void)=&student::eat; void(teacher:: *teachersignal)(void)=&teacher::class; QPushButton *abutton=new QPushButton("",this); connect(abutton,&QPushButton::clicked,st,studentslot);
|
lamada表达式
1 2 3 4 5 6 7 8 9 10
| [](存放参数){}();,lamada表达的标志 =值传递||and 列子: [=](){ btn->setText("123"); }(); mutable修改拷贝数值 int m=10; [m]()mutable{m=100+10}
|

QMainWindow
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| QMainwindow() QMenuBar *bar=menuBar();/菜单栏 setMenuBar(bar); QMenu *fileMenu = bar->addMenu("文件"); fileMenu->addSeparator(); fileMenu->addAction(); QToolBar *toolbar=new QToolBar(this); addToolBar(QT::LeftToolBarArea,toolbar); toolbar->addAction(); toolbar->widget(bar); resize(400,600); QMenuBar *bar=menuBar(); setMenuBar(bar); QMenu *fileMenu= bar->addMenu("文件"); QMenu *siet=bar->addMenu("编辑"); fileMenu->addAction("新建"); QAction *addfile=fileMenu->addAction("打开"); fileMenu->addSeparator(); fileMenu->addMenu("123");
QToolBar *toolbar=new QToolBar(this); addToolBar(Qt::LeftToolBarArea,toolbar); toolbar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea); toolbar->setFloatable(false); toolbar->setMovable(true); toolbar->addAction(addfile); toolbar->addAction("打开"); QPushButton *bat=new QPushButton; toolbar->addWidget(bat);
状态栏的学习 QStatusBar *statubar=statusBar(); setStatusBar(statubar); QLabel *label =new QLabel("提示",this); statubar->addWidget(label); QLabel *label1=new QLabel("righit",this); statubar->addPermanentWidget(label1);
dockwidget->setAllowedAreas(Qt::TopDockWidgetArea|Qt::BottomDockWidgetArea);
QDockWidget *dockwidget =new QDockWidget("浮动",this); addDockWidget(Qt::BottomDockWidgetArea,dockwidget);
QTextEdit * edit=new QTextEdit(this); setCentralWidget(edit); 创建菜单,工具栏,状态栏
|
资源文件
1 2 3 4 5 6 7 8 9 10 11 12 13
| ui,直接操作
将文件保存到项目下
右键项目->添加新文件->QT->QT resourse File ->给资源文件起名
res生成res.qrc
open in editor 编辑资源
添加前缀 添加文字
使用“:+前缀+文件名“
|
对话框
模态对话框(不可以) 非模态对话框(可以对其他窗口操作)
1 2 3 4 5 6 7 8 9 10
| QDialog dlg(this); dlg.resize(200,200); dlg.exec(); qDebug()<<"模态对话框弹出";
QDialog *dil=new QDialog(this); dil->setAttribute(Qt::WA_DeleteOnClose); dil->show();
|
消息对话框(系统提供的对话框)
1 2 3 4 5 6 7 8 9 10 11
| QMessageBox::critical(this,"critical","错误"); QMessageBox::information(this,"123","ok"); if (QMessageBox::Save == QMessageBox::question(this,"123","meiwent",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Save)); { qDebug()<<"选择的是什么"; } QMessageBOX::warning(this,"waring","警告");
|
其他系统对话框
1 2 3 4 5 6 7 8 9 10 11
| QColor color = QColorDialog::getColor(QColor(255,0,0)); qDebug()<<"r="<<color.red()<<"g="<<color.green()<<"b="<<color.blue(); QString str =QFileDialog::getOpenFileName(this,"打开文件","E:\\Uers","*txt"); qDebug()<<str; bool flag; QFont font=QFontDialog::getFont(&flag,QFont("华文彩云",36)); qDebug()<<"字体"<<font.family().toUtf8().data()<<"字号"<<font.pointSize()<<"是否加粗"<<font.bold()<<"是否倾斜"<<font.italic(); font.family().toUtf8().data()
|
ui界面布局
1 2 3 4 5 6 7 8 9 10
| 列子:实现登录窗口 选取QWidget进行布局,水平布局,垂直布局,栅格布局 给用户名,密码,登录,退出按钮进行布局 默认窗口有间隙9,用layoutLeftMargin Horuzontal Spacer弹簧使用 label lineEIdit() ui->setWindowsize(); ui->setWindowfile();
|
ui控件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 按钮: QPushButton 常用按钮 QToolButton 工具按钮 用于显示图片 toolButtonStyle,风格设置,凸起风格autoRaise radioButton 单选按钮,设置默认Ui->xx->setChecked(bool); checkBox 多选按钮,监听状态,2选中,1半选中,0未选中
QListWidget列表容器 QListWidgetitem *itme=new QListWidgetItem; ui->listWidget->additem(item) item->setTextAlignment(Qt::AlignHCenter); QStringList list; list<<"123"<<"456"; listWidget->additems(list);可以添加整个QString,利用list设置宽度
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"英雄介绍"); QTreeWidgetItem *liItem= new QTreeWidgetItem(QStringList()<<"力量"); QTreeWidgetItem *minItem=new QTreeWidgetItem(QStringList()<<"智力"); QTreeWidgetItem *maxItem=new QTreeWidgetItem(QStringList()<<"速度"); ui->treeWidget->addTopLevelItem(liItem); ui->treeWidget->addTopLevelItem(minItem); ui->treeWidget->addTopLevelItem(maxItem);
QStringList str; str<<"我我"<<"ok"; QTreeWidgetItem *man=new QTreeWidgetItem(str); liItem->addChild(man);
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| ui->tableWidget->setColumnCount(3); ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄"); ui->tableWidget->setRowCount(5); QStringList name; QList<QString>sex; name<<"1"<<"2"<<"3"<<"4"<<"5"; sex<<"11"<<"22"<<"33"<<"44"<<"55";
for(int i=0;i<5;i++){ int clo=0; ui->tableWidget->setItem(i,clo++,new QTableWidgetItem(name[i])); ui->tableWidget->setItem(i,clo++,new QTableWidgetItem(sex.at(i))); ui->tableWidget->setItem(i,clo++,new QTableWidgetItem(QString::number(i+1)));
}
|
7.31
其他插件按钮的设置

封装框架
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| 使用 QSpinBox; QSlider; 制作简单框架smallwidget 封装在widgetui上 void(QSpinBox:: *qspinbox)(int)=&QSpinBox:: valueChanged; void(QSlider:: *setvalue)(int)=&QSlider:: setValue;
connect(ui->spinBox,qspinbox,ui->horizontalSlider,setvalue); connect(ui->horizontalSlider,&QSlider::valueChanged,ui->spinBox,&QSpinBox::setValue); 使用widget按钮连接smallwidget connect(ui->getNum,&QPushButton::clicked,[=](){ qDebug()<<ui->widget->getNum(); }); connect(ui->setNum,&QPushButton::clicked,[=](){ ui->widget->setNum(i); }); int smallwidget::getNum() { retrun ui->spinBox->value(); } int smallwidget::getNum(int num) { ui->spinBox->setValue(num); }
|
鼠标控制事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| QEvent; QEnterEvent; widget中的 enterEvent(QEvent*evnet); leaveEvent(QEvent *); QLabel中的鼠标事件 virtual void mouseMoveEvent(QMouseEvent *ev) { 获取arg(ev->x) } virtual void mousePressEvent(QMouseEvent *ev) virtual void mouseReleaseEvent(QMouseEvent *ev) if(ev->buttons()&Qt::LeftButton) QEvent::MouseTrackingChange(true)://设置鼠标的追踪状态,不需要press
|
定时器事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 设置QLabel定时器 QTimerEvent; 启动方式 id=startTimer(1000); if(ev->timerId()==id) { ui->label->setText(QString ::number(num++)); }
QTimer *star=new QTimer(this); star->start(500); connect(star,&QTimer::timeout,ui->label_3,[=](){ static int num=1; ui->label_3->setText(QString::number(num++)); }); connect(ui->pushButton,&QPushButton::clicked,ui->label_3,[=](){ star->stop(); }); connect(ui->pushButton_2,&QPushButton::clicked,[=](){ star->start(500); });
|
event事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 事件分发器使用 通过事件分发器拦截: 拦截鼠标点击 bool event(QEvent *); e->type(): QEvent *e; if(e->type()==QEvent::MouseButtonPress) {QMouseEvent *ev=static_cast<QMouseEvent>(e);
return true; }
return QLabel::event(e); 事件过滤器
|

QPainter绘图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| QPainter painter(this); QPen pen(QColor(255,0,0)); pen.setWidth(3); pen.setStyle(Qt::DotLine); painter.setPen(pen);
QBrush brush(QColor(0,255,0));
painter.setBrush(brush); brush.setStyle(Qt::Dense1Pattern); painter.drawLine(QPoint(0,0),QPoint(100,100)); painter.drawEllipse(QPoint(100,100),50,50); painter.drawRect(QRect(20,20,50,50)); painter.drawText(QRect(10,20,150,50),"好好学习,123456"); 利用update();调用绘图事件 painter.drawPixmap(x,y,QPixmap(文件));
绘画设备继承QPainterDevice的子类的使用。 QPixmap;显示的优化 QPixmap pix(30,30); pix.fill()填充颜色 QPainter painter(&pix); pix.save();
QImage;像素修改 QImage img(300,300,Qlmage::Foramt_RGB32); QRgb value=qRgb(255,0,0); img.setPixel(i,j,value);修改图画的像素点 QPicture记录和重现绘图 QPicture pic; painter.begin(&pic);开始向pic上面绘画 painter.end(); pic.save(后缀名任意)保存图片 painter.drawPicture(0,0,,pic);重现绘画 QBitmap;(黑白色)
|
file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| 文件操作 弹窗选取文件 QString path=QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\Admin\\Desktop"); 设置文本显示的编码0. + 0方式 QTextCodec *codec=QTextCodec::codecForName("gbk"); 以编码方式显示 ui->textEdit->setText(codec->toUnicode(array)); 读取文件内容 QFile file(path);//读取文件内容,参数是文件路径 file.open(QIODevice::ReadOnly);//只读方式打开 读取所有行 QByteArray array=file.readAll();//读取所有内容 逐行读取 QByteArray array; while(!file.atEnd()){ array+=file.readLine();//按行读取 } 放入文本框显示 ui->textEdit->setText(array);//将读取到的数据放入 textEdit 中 关闭文件 file.close(); 写入文件 file.open(QIODevice::Append);//追加方式进行写 file.write("啊啊啊"); file.close(); 文件信息类 定义 QFileInfo info(path); 打印信息 qDebug()<<"大小:"<<info.size()<<" 后缀名:"<<info.suffix()<<" 文件名称:"<<info.fileName()<<" 文件路径:"<<info.path(); qDebug()<<"创建日期:"<<info.created().toString("yyyy/MM/dd hh:mm:ss"); //添加 头文件 #include<QDateTime> qDebug()<<"最后修改日期:"<<info.lastModified().toString("yyyy - MM - dd hh:mm:ss"); 说明 查看帮助QDataTime ->toString 里面列举了单独取出年、月、日
|