QT入门学习——从信号和槽到对话框,各种控件以及自定义控件
- 世界杯冠军奖金
- 2026-02-07 19:02:43
- 2523
引出QT入门学习——从信号和槽到对话框,各种控件以及自定义控件
qt的使用代码语言:java复制//类名首字母大写,单词和单词之间首字母大写
//函数名变量名称首字母小写,单词和单词之间首字母大写
//快捷键
//注释ctrl +/
// 运行 ctrl +r
// 编译 ctrl b
//字体缩放ctr1+ 鼠标滚轮
//查找 ctrl+f
//整行移动 ctrl+shift+↑或者,
//帮助文档F1
//自动对齐 ctrl i;
//同名之间的.h和.cpp切换 F4
//帮助文档第一种方式F1第二种左侧按钮 1
//D:\MyPrograme\QT\5.14.2\mingw73_32\bin创建第一个Qt程序2.1点击创建项目后,选择项目路径到以及给项目起名称
2.2名称·不能有中文不能有空格
2.3路径·不能有中文路径
2.4默认创建有窗口类,yWidget,基类有三种选择:QWidget、QMainWindowQDialog
2.5 main函数
2.5.1 QApplication a应用程序对象,有且仅有一个
2.5.2 mywidget w;实例化窗口对象
2.5.3 w.show0调用show函数显示窗口
2.5.4 return a.exec(让应用程序对家进入消总循环机,制中,代码阻塞到当前行
代码语言:java复制#include "mywidget.h"
#include
#include
// main程序入口 argc 命令行变量数量,argv命令行变量数组
int main(int argc, char *argv[])
{
// 应用程序对象,qt中有且只有一个
QApplication a(argc, argv);
// 窗口默认不显示,需要调用show方法
myWidget w;
w.show();
// 进入消息循环,死循环
return a.exec();
}3按钮控件常用API
3.1 创建QPushButton*btn=new QPushButton
3.2 设置父亲setParent(this
3.3 设置文本 setText(文字")
3.4 设置位置move宽,高W
3.5 重新指定商口大小 resize
3.6 设置窗口标题 setwindowTitle
3.7 设置窗口固定大小setFixedsize
代码语言:java复制#include "mywidget.h"
#include
#include
myWidget::myWidget(QWidget *parent)
: QWidget(parent)
{
QLabel *label = new QLabel("hello qt");
label->setParent(this);
// 创建按钮
QPushButton *btn = new QPushButton("第二个按钮",this);
btn->move(100,100);
// 充值窗口大小
resize(600,400);
setWindowTitle("第一个窗口");
}
myWidget::~myWidget()
{
}对象树概念4对像树
4.1 当创建的对象在堆区时候,如果指定的父亲是QObject派生下来的类或者QObject子类派生下来的类,可以不用管理释放的操作,将对象会放入到对象树中。
4.2 一定程度上简化了内存回收机制
信号signal槽slot信号的发送者,发送的具体信号,信号的接受者,信号的处理(槽)
信号槽的优点,松散耦合,信号发送端和接受端本身是没有关联的,通过 connect连接将两端耦合在一起
6信号和槽
6.1连接函数:connect
6.2参数
6.2.1参数1 信号的发送者
6.2.2参数2 发送的信号(函数地址)
6.2.3参数3 信号的接受者
6.2.4参数4 处理的槽函数(函数的地址)
6.3松散羯合
自定义信号和槽1.自定义信号写到signals下
返回void
需要声明,不需要实现
可以有参数,可以重戟
2.自定义槽返回void
需要声明,也需要实现
可以有参数,可以重载
写到public slot下或者public或者全局函数
3.建立连接代码语言:java复制// 老师饿了,学生请吃饭
connect(te,&Teacher::hungry,st,&Student::treat);4.进行触发自定义信号重载当自定义信号和槽出现重载
8.1 需要利用还数指针明确指向函数的地址·
8.2void(Teacher::tsignal )QString )=&Teacher::hungry;
8.3 QString转成char *
8.3.1.ToUtf80转为QByteArray
8.3.2.Data0转为Char *
8.4信号可以连接信号
8.5断开信号disconnect
带参数的代码语言:java复制 void (Teacher::*teacherSignal)(QString) = &Teacher::hungry;
void (Student::*StudentSlot)(QString) = &Student::treat;代码语言:java复制void Student::treat(QString foodName){
// QString -> char * 先转成QByteArray(.toUtf8()) 再转成Char* ()
qDebug() << "请老师吃。。。" << foodName.toUtf8().data();
}按钮触发代码语言:java复制 // 用一个按钮调用下课
QPushButton *btn = new QPushButton("下课了",this);
// 重置窗口daxiao
this->resize(600,400);
connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);信号触发信号代码语言:java复制 // 无参的信号和槽连接
void (Teacher::*teacherSignal2)(void) = &Teacher::hungry;
void (Student::*StudentSlot2)(void) = &Student::treat;
connect(te,teacherSignal2,st,StudentSlot2);
// 信号连接信号
connect(btn,&QPushButton::clicked,te,teacherSignal2);断开信号disconnect
拓展1、信号是可以连接信号
2、一个信号可以连接多个槽函数
3、多个信号可以连接同一个糟函数
4、信号和槽函数的参数必须类型一一对应
5、信号和槽的参数个数是不是要一致?信号的参数个数可以多余槽函数的参数个数
connect(信号的发送者,发送的信号signal信号),信号接受者,槽函数SLOT)
优点:参数直观
缺点:编译器不会检测爸数类型:
lambda表达式代码语言:java复制 [=](){
btn->setText("aaa");
}();返回值代码语言:java复制 int ret = []()->int{return 1000;}();
qDebug() << "ret = " << ret;mutable修饰代码语言:java复制 QPushButton *myBtn1 = new QPushButton(this);
QPushButton *myBtn2 = new QPushButton(this);
myBtn1->move(100,100);
int m = 10;
connect(myBtn1,&QPushButton::clicked,this,
[m]()mutable {m=100+10;qDebug()<< m;});
connect(myBtn2,&QPushButton::clicked,this,
[=](){qDebug()< qDebug() << m;案例代码语言:java复制 QPushButton * btnClose = new QPushButton; btnClose->setText("close"); btnClose->move(100,0); btnClose->setParent(this); connect(btnClose,&QPushButton::clicked,this, [=](){ btnClose->setText("关闭"); emit te->hungry("娃哈哈"); // this->close(); });打开关闭窗口案例代码语言:java复制#include "widget.h" #include "ui_widget.h" #include Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); // 窗口 QWidget *myWidget = new QWidget; myWidget->resize(200,200); QPushButton *btnOpen = new QPushButton("打开",this); this->resize(600,400); connect(btnOpen,&QPushButton::clicked, this,[=](){ myWidget->show(); }); QPushButton *btnclose = new QPushButton("关闭",this); btnclose->move(200,0); connect(btnclose,&QPushButton::clicked, this,[=](){ myWidget->close(); }); // 一个按钮控制两个窗口 QWidget *myWidget1 = new QWidget; myWidget1->resize(300,100); QPushButton *myBtn = new QPushButton("open",this); myBtn->move(50,50); connect(myBtn,&QPushButton::clicked,this, [=](){ if(myBtn->text()=="open"){ myBtn->setText("close"); myWidget1->show(); } else { myBtn->setText("open"); myWidget1->close(); } }); } Widget::~Widget() { delete ui; }qt的菜单栏工具栏菜单栏,工具栏1QMainWindow 1.1菜单栏最多有一个 1.1.1 QMenuBar * bar MenuBar(); 1.1.2 setMenuBar(bar) 1.1.3 QMenu * fileMenu=bar->addMenu(文件") 创建菜单 1.1.4 QAction * newAction=ileMenu->addAction(新建");创建菜单项; 1.1.5 添加分割线fileMenu->adSeparator(); 1.2工具栏可以有多个 1.2.1 QToolBar * toolbar new QToolBar(this); 1.2.2 addToolBar(默认停靠区域,toolbar )Qt::LeftToolBarArea 1.2.3 设置后期停靠区域,设置浮动,设置移动 1.2.4 添加菜单项或者添加小控件 状态栏,浮动窗口代码语言:java复制#include "mainwindow.h" #include #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { // 重置窗口大小 resize(600,400); QMenuBar *bar = menuBar(); setMenuBar(bar); QMenu *fileMenu = bar->addMenu("文件"); QMenu *editMenu = bar->addMenu("编辑"); // 创建菜单项, 最多只能有1个 fileMenu->addAction("新建"); // 添加分割符 fileMenu->addSeparator(); QAction *openAc= fileMenu->addAction("打开"); // 工具栏 可以有多个 QToolBar * toolbar = new QToolBar(this); addToolBar(Qt::LeftToolBarArea,toolbar); // 只允许左右停靠 toolbar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea); // 设置浮动 toolbar->setFloatable(false); // 设置移动,总开关 toolbar->setMovable(false); toolbar->addAction("工具"); toolbar->addAction(openAc); // 状态栏,最多一个 QStatusBar *stBar = statusBar(); setStatusBar(stBar); // 放标签控件 QLabel *label = new QLabel("提示信息",this); stBar->addWidget(label); QLabel *labelRight = new QLabel("右侧提示信息",this); stBar->addPermanentWidget(labelRight); // 铆接部件,浮动窗口,可以有多个 QDockWidget * dockWidget = new QDockWidget("浮动",this); addDockWidget(Qt::BottomDockWidgetArea,dockWidget); dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea); // 设置中心组件, 只能有一个 QTextEdit *edit = new QTextEdit(this); setCentralWidget(edit); } MainWindow::~MainWindow() { }属性设计ui编辑控件添加图片对话框模态方式模态:不可对其他窗口操作;非模态:可操作; 代码语言:java复制#include "mainwindow.h" #include "ui_mainwindow.h" #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 点击新建 connect(ui->actionNew,&QAction::triggered, [=](){ // 对话框分类, // 模态:不可对其他窗口操作;非模态:可操作; QDialog dlg(this); dlg.resize(200,200); dlg.exec(); qDebug() << "模态对话框弹出,阻塞了"; }); } MainWindow::~MainWindow() { delete ui; }非模态方式代码语言:java复制 // 非模态对话框 QDialog *dlg2 = new QDialog (this); dlg2->resize(200,200); dlg2->show(); dlg2->setAttribute(Qt::WA_DeleteOnClose); qDebug() << "非模态对话框弹出";系统对话框消息框代码语言:java复制#include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 点击新建 connect(ui->actionNew,&QAction::triggered, [=](){ // 错误对话框 // QMessageBox::critical(this,"错误","一个错误的弹窗"); // 消息对话框 // 参数1父亲 参数2标题 参数3提示内容 参数4按键类型 参数5默认关联回车按键 QMessageBox::StandardButton choose = QMessageBox::question( this,"选择","是否选择",QMessageBox::Save | QMessageBox::Cancel, QMessageBox::Save); if(QMessageBox::Save==choose){ qDebug() << "选择的是保存"; }else { qDebug() << "选择的是取消"; } }); } MainWindow::~MainWindow() { delete ui; }颜色框代码语言:java复制 QColor color = QColorDialog::getColor(QColor(255,0,0)); qDebug() << "color=" << color.red();文件框代码语言:java复制 //文件对话框 // 参数1父亲 参数2标题 参数3默认打开路径 参数4过滤文件格式 //返回值是选取的路径 QString str = QFileDialog::getOpenFileName( this,"打开文件","D:\\MyFiles\\myLearn\\QT","(*.txt)"); qDebug() << "filePath = " << str;界面布局利用布局方式给窗口进行美化 选取widget进行布局,水平布局、垂直布局、栅格布局 给用户名、密码、登陆、退出按钮进行布局: 默认窗口和控件之间有9间隙,可以调整layoutLeftMargin 利用弹篝进行布局 默认框框有9像素 输入框密码的输入 tool按钮单选框多选框半选状态,需要进入如下的设置 listWidget代码语言:java复制#include "widget.h" #include "ui_widget.h" #include Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); // 单选按钮 男默认选中 ui->rBtnMan->setChecked(true); // 选中女,打印 connect(ui->rBtnWoman,&QRadioButton::clicked,this, [=](){ qDebug() << "选中了女的"; }); // 多选 connect(ui->checkBox,&QCheckBox::stateChanged,this, [=](int state){ qDebug() << "多选框" << state; }); // 利用listWidget写诗 // QListWidgetItem *item = new QListWidgetItem("锄禾日当午"); // // 将这一行放入控件中 // ui->listWidget->addItem(item); // item->setTextAlignment(Qt::AlignHCenter); // QString QStringList list; list << "锄禾日当午" << "汗滴禾下土" << "谁知盘中餐" << "粒粒皆辛苦"; ui->listWidget->addItems(list); } Widget::~Widget() { delete ui; }QTreeWidget代码语言:java复制#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); // treeWidget树控件 // 设置水平头 ui->treeWidget->setHeaderLabels( QStringList() << "英雄"<< "英雄介绍"); // 匿名对象 QTreeWidgetItem *itemL = new QTreeWidgetItem(QStringList() << "力量"); QTreeWidgetItem *itemM = new QTreeWidgetItem(QStringList() << "敏捷"); QTreeWidgetItem *itemZ = new QTreeWidgetItem(QStringList() << "智力"); // 加顶层节点 ui->treeWidget->addTopLevelItem(itemL); ui->treeWidget->addTopLevelItem(itemM); ui->treeWidget->addTopLevelItem(itemZ); // 追加自节点 QStringList heroL1; heroL1 << "力量超强" << "很厉害"; QTreeWidgetItem *l = new QTreeWidgetItem(heroL1); itemL->addChild(l); } Widget::~Widget() { delete ui; }QTableWidget代码语言:java复制#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // tableWidget控件 // 设置列数 ui->tableWidget->setColumnCount(3); // 设置 表头 ui->tableWidget->setHorizontalHeaderLabels( QStringList() << "姓名" << "性别" << "年龄"); // 设置行数 ui->tableWidget->setRowCount(4); // 设置正文 ui->tableWidget->setItem(0,0,new QTableWidgetItem("张三")); QStringList nameList; nameList << "张三" << "李四" << "王五"; QList sexList << "男" << "女" <<"男"; for (int i=0;i <3 ;i++) { int col = 0; // nameList[i] 越界直接就挂了。 ui->tableWidget->setItem(i,col++,new QTableWidgetItem(nameList[i])); // sexList.at(i) 越界抛出异常 ui->tableWidget->setItem(i,col++,new QTableWidgetItem(sexList.at(i))); //nt 转为Qstring: QString::number(i+18) i ui->tableWidget->setItem(i,col++,new QTableWidgetItem(QString::number(i+18))); } } MainWindow::~MainWindow() { delete ui; }其他控件stackedWidget代码语言:java复制#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); // 栈控件的使用 //默认页面 ui->stackedWidget->setCurrentIndex(2); // scrollArea的使用 connect(ui->btnHome,&QPushButton::clicked, [=](){ ui->stackedWidget->setCurrentIndex(1); }); connect(ui->btnPush,&QPushButton::clicked, [=](){ ui->stackedWidget->setCurrentIndex(0); }); connect(ui->btnTool,&QPushButton::clicked, [=](){ ui->stackedWidget->setCurrentIndex(2); }); } Widget::~Widget() { delete ui; }combox下拉框代码语言:java复制 // 下拉框 ui->comboBox->addItems(QStringList() << "宝马" << "奔驰" << "拖拉机"); // 点击按钮 connect(ui->selectTuo,&QPushButton::clicked, [=](){ ui->comboBox->setCurrentIndex(2); // ui->comboBox->setCurrentText("拖拉机"); });label标签代码语言:java复制 // 图片 ui->lbl_img->setPixmap(QPixmap(":/sw.png"));自定义控件自定义一个控件自定义控件定义方法函数代码语言:java复制#include "smallwid.h" #include "ui_smallwid.h" SmallWid::SmallWid(QWidget *parent) : QWidget(parent), ui(new Ui::SmallWid) { ui->setupUi(this); // QSpinBox移动,QSlider跟着移动 void(QSpinBox::* spSignal) (int) = &QSpinBox::valueChanged; connect(ui->spinBox,spSignal, ui->horizontalSlider,&QSlider::setValue); // QSlider滑动,QSpinBox滑动 connect(ui->horizontalSlider, &QSlider::valueChanged, ui->spinBox,&QSpinBox::setValue); } // 设置和获取数字 void SmallWid::setNum(int num) { ui->spinBox->setValue(num); } int SmallWid::getNum() { return ui->spinBox->value(); } SmallWid::~SmallWid() { delete ui; }widget窗口调用函数代码语言:java复制#include "widget.h" #include "ui_widget.h" #include Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); // 点击获取,获取到控件当前的值 connect(ui->btnGetNum,&QPushButton::clicked, [=](){ int v = ui->widget->getNum(); qDebug() << "获取的值为:" << v; }); // 设置到一半 connect(ui->btnSetHarlf,&QPushButton::clicked, [=](){ ui->widget->setNum(50); }); } Widget::~Widget() { delete ui; }总结QT入门学习——从信号和槽到对话框,各种控件以及自定义控件