qt Study
按钮->点击->窗口->关闭窗口
connect(信号的发送者,发送具体信号,信号的接收者,信号的处理);
信号处理函数称为槽
信号槽的优点,松散耦合,信号发送端和接收端本身是没有关联的,通过connect连接将两端耦合在一起
//点击按钮,关闭当前窗口 connect(myBtn, &QPushButton::clicked, this, &QWidget::close);
自定义信号和槽
teacher.h
#ifndef TEACHER_H #define TEACHER_H #include <QObject> class Teacher : public QObject { Q_OBJECT public: explicit Teacher(QObject *parent = nullptr); //自定义信号写到signals下 //返回值类型为void,只需要声明,不需要实现 //可以有参数,可以重载 signals: void hungry(); }; #endif // TEACHER_H
student.h
#ifndef STUDENT_H #define STUDENT_H #include <QObject> class Student : public QObject { Q_OBJECT public: explicit Student(QObject *parent = nullptr); //可以写到public下 //返回值类型为void,需要声明,也需要实现 //可以有参数,也可以重载 void please(); signals: }; #endif // STUDENT_H
student.cpp
#include "student.h" #include <iostream> Student::Student(QObject *parent) : QObject(parent) { } void Student::please() { std::cout << "please teacher eat dinner" << std::endl; }
mywidget.h
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include "teacher.h" #include "student.h" class myWidget : public QWidget { Q_OBJECT public: myWidget(QWidget *parent = nullptr); Teacher *t = new Teacher(this); Student *s = new Student(this); ~myWidget(); }; #endif // MYWIDGET_H
mywidegt.cpp
回调函数:在函数内部将被调函数名转换为地址作为参数供系统调用
信号可以连接信号
信号与槽的连接可以是一对多、多对一
信号的参数可以比槽多,但对应的参数在类型和顺序上要一致 (对于不匹配的,可以用匿名函数来调用相应的槽)
匿名函数的使用

btn->show(); connect(btn, &QPushButton::clicked, this, [=](){ QWidget *window1 = new QWidget; window1->show(); btn->setText("close"); });
#include "mywidget.h" myWidget::myWidget(QWidget *parent) : QWidget(parent) { connect(this->t, &Teacher::hungry, this->s, &Student::please); emit(this->t->hungry()); // 重载时,通过函数指针传递函数地址 // //定义某类中函数的函数指针,要加类名以表作用域 // void (Teacher:: *hungryptr) (std::string name) = &Teacher::hungry; // void (Student:: *pleaseptr) (std::string name) = &Student::please; // connect(this->t, hungryptr, this->s, pleaseptr); // emit(this->t->hungry("good food")); } myWidget::~myWidget() { }
菜单栏与工具栏
#include <QMenuBar>
#include <QToolBar>
QMenuBar *menubar = new QMenuBar(this); //菜单栏 QMenu *menu1 = new QMenu("file"); // 菜单 menu1->addAction("new"); menu1->addAction("open"); menubar->addMenu(menu1); menubar->move(200, 300); QToolBar *toolbar = new QToolBar(this); // 工具栏 toolbar->addAction("new"); toolbar->addAction("open");
自定义对话框
模态对话框:不可以对其他窗口进行操作
非模态对话框:可以对其他窗口进行操作
#include <QDialog>
// 模态 QDialog log1(this); log1.resize(100, 200); log1.exec(); // 非模态,用指针建立,存储在堆上,如果存在栈上匿名函数执行完就释放了 // 会出现一闪而过的情况,模态的不需要 QDialog *log2 = new QDialog(this); log2->resize(100, 200); log2->show(); log2->setAttribute(Qt::WA_DeleteOnClose); //关闭时释放内存,不然会内存泄漏
标准对话框
#include <QMessageBox>
QMessageBox::critical(this, "critical", "out of range"); QMessageBox::information(this, "info", "text"); // QMessageBox::question(this, "query", "answer", QMessageBox::Save | QMessageBox::No); if( QMessageBox::question(this, "query", "answer", QMessageBox::Save | QMessageBox::No) == QMessageBox::Save) { std::cout << "select Save" << std::endl; } else { std::cout << "select No" << std::endl; }
布局
水平布局、垂直布局、栅格布局
使用时可以直接创建相应布局,将需要布局的item放入即可
或者创建Widget,放入item并选择相应布局
使用Horizontal spacer 或者 Vertical spacer来将label、按钮、编辑框等自适应窗口大小
QStringList
QListWidgetItem *item = new QListWidgetItem("1111"); QStringList strs; // string list strs << "111" << "222" << "333"; ui->listWidget->addItem(item); ui->listWidget->addItems(strs);
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2021-10-20 984. 不含 AAA 或 BBB 的字符串
2021-10-20 pcl 版本 代码语法问题