QT学习笔记(上)

news2024/11/19 5:57:25

QT学习笔记(上)

文章目录

  • QT学习笔记(上)
    • 1. 窗口和按钮
    • 2. 创建一个自定义的QPushButton
      • 2.1 mypushbutton.h
      • 2.2 mypushbuttion.cpp
      • 2.3 mainwindow.cpp引用mypushbutton
    • 3. QT坐标原点
    • 4. 信号与槽
    • 5. 自定义信号和槽
    • 6. 信号和槽的重载
    • P12 信号连接信号
    • P13 QT4之前的连接函数写法
    • P14 lambda表达式
    • 练习:使用按钮来控制窗口的开闭
    • P17 菜单栏和工具栏
    • P18 状态栏和浮动窗口
    • P19
    • P20 对话框

1. 窗口和按钮

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qpushbutton.h>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 创建一个按钮
    QPushButton *btn = new QPushButton;
//    btn->show();
    // depends on MainWindow
    btn->setParent(this);
    // 显示文本
    btn->setText("第一个按钮");
    // 第二个按钮
    QPushButton * btn2 = new QPushButton("第二个按钮", this);
    // 移动
    btn2->move(100, 100);
    // 重置窗口大小
//    resize(600, 400);
    setFixedSize(600, 400);
    // 设置窗口标题
    setWindowTitle("第一个窗口");
}

MainWindow::~MainWindow()
{
    delete ui;
}

在这里插入图片描述

2. 创建一个自定义的QPushButton

2.1 mypushbutton.h

#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H

#include <QPushButton>

class mypushbutton : public QPushButton
{
    Q_OBJECT
public:
    explicit mypushbutton(QWidget *parent = nullptr);

    ~mypushbutton();

signals:

};

#endif // MYPUSHBUTTON_H

2.2 mypushbuttion.cpp

#include "mypushbutton.h"
#include <QDebug>

mypushbutton::mypushbutton(QWidget *parent)
    : QPushButton{parent}
{
    qDebug() << "我的按钮构造函数";

}

mypushbutton::~mypushbutton(){
    qDebug() << "我的按钮类析构";
}

2.3 mainwindow.cpp引用mypushbutton

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qpushbutton.h>
#include "mypushbutton.h"
#include <QDebug>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 创建一个按钮
    QPushButton *btn = new QPushButton;
//    btn->show();
    // depends on MainWindow

    btn->setParent(this);
    // 显示文本
    btn->setText("第一个按钮");
    // 第二个按钮
    QPushButton * btn2 = new QPushButton("第二个按钮", this);
    btn2->resize(50, 50);


    // 移动
    btn2->move(100, 100);
    // 重置窗口大小
//    resize(600, 400);
    setFixedSize(600, 400);
    // 设置窗口标题
    setWindowTitle("第一个窗口");

    // 创建自己的按钮
    mypushbutton * myBtn = new mypushbutton;
    myBtn->setText("我自己的按钮");
    myBtn->move(200, 0);
    myBtn->setParent(this);

}

MainWindow::~MainWindow()
{
    qDebug() << "my widget 析构调用";
    delete ui;
}


可以看到构造函数以及析构函数的调用
在这里插入图片描述

3. QT坐标原点

QT的坐标原点是在左上角,向下和向右为正方向。

4. 信号与槽

核心: 使用connect函数进行连接,指定信号的发送者,信号(函数地址),信号的接收者,槽函数(函数地址形式)。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qpushbutton.h>
#include "mypushbutton.h"
#include <QDebug>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 创建一个按钮
    QPushButton *btn = new QPushButton;
//    btn->show();
    // depends on MainWindow

    btn->setParent(this);
    // 显示文本
    btn->setText("第一个按钮");
    // 第二个按钮
    QPushButton * btn2 = new QPushButton("第二个按钮", this);
    btn2->resize(50, 50);


    // 移动
    btn2->move(100, 100);
    // 重置窗口大小
//    resize(600, 400);
    setFixedSize(600, 400);
    // 设置窗口标题
    setWindowTitle("第一个窗口");

    // 创建自己的按钮
    mypushbutton * myBtn = new mypushbutton;
    myBtn->setText("关闭窗口");
    myBtn->move(200, 0);
    myBtn->setParent(this);

    // 点击按钮,关闭窗口
    // 发送者, 信号(函数地址,+引用), 接收者, 槽函数  
    connect(myBtn, &mypushbutton::clicked, this, &MainWindow::close);


}

MainWindow::~MainWindow()
{
    qDebug() << "my widget 析构调用";
    delete ui;
}


5. 自定义信号和槽

重点: 信号,写在signals下面,槽,写在public下面,连接如4小节,连接后需要触发信号。
teacher部分
teacher.h

#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>

class Teacher : public QObject
{
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = nullptr);

signals:
    // 自定义信号
    // 只声明,不实现
    // 可以有参数,可以重载
    void hungry();

};

#endif // TEACHER_H

teacher.cpp

#include "teacher.h"

Teacher::Teacher(QObject *parent)
    : QObject{parent}
{

}

student部分

student.h

#ifndef STUDENT_H
#define STUDENT_H

#include <QObject>

class Student : public QObject
{
    Q_OBJECT
public:
    explicit Student(QObject *parent = nullptr);
    // 槽函数。早期qt必须写在 public_slots, 后期写在public
    // 返回值是void,需要声明和实现,
    // 可以有参数,可以重载
    void treat();


signals:



};

#endif // STUDENT_H

student.cpp

#include "student.h"
#include <QDebug>

Student::Student(QObject *parent)
    : QObject{parent}
{

}


void Student::treat(){
    qDebug() << "请老师吃饭";
}

窗口部分
widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include "teacher.h"
#include "student.h"



#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;

    Teacher* zt;
    Student* st;
    void classIsOver();


};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 初始化控件
    this->zt = new Teacher(this);
    this->st = new Student(this);
    connect(zt, &Teacher::hungry, st, &Student::treat);

    // 调用函数
    classIsOver();


}

void Widget::classIsOver(){
    emit zt->hungry();
}




Widget::~Widget()
{
    delete ui;
}


6. 信号和槽的重载

核心点:信号和槽重载时候需要使用函数指针来指定类中重载的版本。
函数指针:

void (Teacher::*teacherSignal)(QString) = &Teacher::hungry;
conect(tz, teacherSignal, ...)
    void (Teacher::*teacherSignal)(QString) = &Teacher::hungry;
    void (Student::*studentSlot)(QString) = &Student::treat;


    connect(zt, teacherSignal, st, studentSlot);

P12 信号连接信号

核心:连个信号连接的方法

比较笨的方法:利用一个slot进行转发

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 初始化控件
    this->zt = new Teacher(this);
    this->st = new Student(this);
//    connect(zt, &Teacher::hungry, st, &Student::treat);

    // 调用函数
//    classIsOver();


    void (Teacher::*teacherSignal)(QString) = &Teacher::hungry;
    void (Student::*studentSlot)(QString) = &Student::treat;
    connect(zt, teacherSignal, st, studentSlot);
    QPushButton *btn = new QPushButton("下课", this);
    this->resize(600, 400);
    connect(btn, &QPushButton::clicked, this, &Widget::classIsOver);

}

void Widget::classIsOver(){
//    zt->hungry();
    emit zt->hungry("宫保鸡丁");

}




Widget::~Widget()
{
    delete ui;
}


好的方法: 使用信号连接信号,解释和代码如下图所指请添加图片描述

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 初始化控件
    this->zt = new Teacher(this);
    this->st = new Student(this);
//    connect(zt, &Teacher::hungry, st, &Student::treat);

    // 调用函数
//    classIsOver();


//    void (Teacher::*teacherSignal)(QString) = &Teacher::hungry;
//    void (Student::*studentSlot)(QString) = &Student::treat;
//    connect(zt, teacherSignal, st, studentSlot);
//    QPushButton *btn = new QPushButton("下课", this);
//    this->resize(600, 400);
//    connect(btn, &QPushButton::clicked, this, &Widget::classIsOver);


    QPushButton *btn = new QPushButton("下课", this);
    void(Teacher::*ztSignal)(void) = &Teacher::hungry;
    void(Student::*stuSlot)(void) = &Student::treat;
    connect(zt, ztSignal, st, stuSlot);
    connect(btn, &QPushButton::clicked, zt, ztSignal);


}

void Widget::classIsOver(){
//    zt->hungry();
    emit zt->hungry("宫保鸡丁");

}




Widget::~Widget()
{
    delete ui;
}


断开连接:disconnect

disconnect(zt, ztSignal, st, stuSlot);

P13 QT4之前的连接函数写法

笔记:

  1. 信号可以连接信号
  2. 一个信号可以连接多个槽函数
  3. 多个信号可以连接同一个槽函数
  4. 信号和槽函数的参数,必须是一一对应
  5. 信号和槽的参数个数,是不是要一致?信号的参数个数,可以多于槽函数的参数个数
  6. QT4版本对连接函数的写法,好处是直观,缺点是不会检查参数。
// qt4以前的连接代码
    connect(zt, SIGNAL(hungry()), st, SLOT(treat()));

P14 lambda表达式

[](){
	....
}
  1. []标识符 匿名函数
  2. & 引用传递
  3. {}实现体
  4. mutable修饰值传递变量,可以修改拷贝出的数据,改变不了主体
  5. 返回值 ->int {}
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 初始化控件
    this->zt = new Teacher(this);
    this->st = new Student(this);
//    connect(zt, &Teacher::hungry, st, &Student::treat);

    // 调用函数
//    classIsOver();


//    void (Teacher::*teacherSignal)(QString) = &Teacher::hungry;
//    void (Student::*studentSlot)(QString) = &Student::treat;
//    connect(zt, teacherSignal, st, studentSlot);
//    QPushButton *btn = new QPushButton("下课", this);
//    this->resize(600, 400);
//    connect(btn, &QPushButton::clicked, this, &Widget::classIsOver);


    QPushButton *btn = new QPushButton("下课", this);
    void(Teacher::*ztSignal)(void) = &Teacher::hungry;
    void(Student::*stuSlot)(void) = &Student::treat;
//    connect(zt, ztSignal, st, stuSlot);
    connect(btn, &QPushButton::clicked, zt, ztSignal);
    // qt4以前的连接代码
    connect(zt, SIGNAL(hungry()), st, SLOT(treat()));

    [=](){
        btn->setText("aaa");
    }();

    QPushButton *btn1 = new QPushButton("按钮1", this);
    QPushButton *btn2 = new QPushButton("按钮2", this);

    btn2->move(100, 0);
    int m = 100;
    // mutable: m拷贝一份,并里面修改他的拷贝
    connect(btn1, &QPushButton::clicked, this, [m]()mutable{m=m+100; qDebug() << m;});
    connect(btn2, &QPushButton::clicked, this, [=](){
        qDebug()<< m;
    });

    int b = []()->int{return 100;}();

    QPushButton *btn3 = new QPushButton("关闭窗口", this);
    btn3->move(200, 0);
    connect(btn3, &QPushButton::clicked, this, [=](){
//        this->close();
        st->treat("牛肉");
    });


}

void Widget::classIsOver(){
//    zt->hungry();
    emit zt->hungry("宫保鸡丁");

}


Widget::~Widget()
{
    delete ui;
}

练习:使用按钮来控制窗口的开闭

#include "widget.h"
#include "ui_widget.h"
#include "movie.h"
#include <QPushButton>
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    setWindowTitle("第一个窗口");
    QPushButton *bt1 = new QPushButton("打开窗口", this);
    QPushButton *bt2 = new QPushButton("关闭窗口", this);
    bt2->move(0, 100);

    QWidget *one  = new QWidget;
    connect(bt1, &QPushButton::clicked, this, [=](){
        one->show();
    });
    connect(bt2, &QPushButton::clicked, this, [=](){
        one->close();
    });

}

P17 菜单栏和工具栏

在这里插入图片描述

下面是在窗口中添加菜单栏和工具栏的基本代码。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>
#include <QToolBar>
#include <QPushButton>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    resize(600, 400);
//    setFixedSize(600, 400);

    // 创建菜单栏
    QMenuBar *bar =  menuBar();
    // 放入屏幕中
    setMenuBar(bar);

    // 创建菜单
    QMenu *fileMenu = bar->addMenu("文件");
    QMenu *editMenu = bar->addMenu("编辑");

    // 菜单项
    QAction *newAction = fileMenu->addAction("新建");
    // 添加分隔线
    fileMenu->addSeparator();
    QAction *openAction = 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(newAction);
    toolBar->addSeparator();
    toolBar->addAction(openAction);
    // 工具栏添加控件
    QPushButton *btn = new QPushButton("aa", this);
    toolBar->addWidget(btn);


}

MainWindow::~MainWindow()
{
    delete ui;
}


P18 状态栏和浮动窗口

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>
#include <QToolBar>
#include <QPushButton>
#include <QStatusBar>
#include <QLabel>
#include <QDockWidget>
#include <QTextEdit>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
	// ......前面的代码

    // 状态栏,最多一个
    QStatusBar * stBar = statusBar();
    setStatusBar(stBar);

    // 放标签控件
    QLabel *label = new QLabel("提示信息", this);
    stBar->addWidget(label);

    QLabel *label2 = new QLabel("右侧提示信息", this);
    stBar->addPermanentWidget(label2);

    // 铆接部件(浮动窗口,可以多个)
    QDockWidget *dockerWidget = new QDockWidget("浮动", this);
    addDockWidget(Qt::BottomDockWidgetArea, dockerWidget);
    // 设置后期停靠位置
    dockerWidget->setAllowedAreas(Qt::TopDockWidgetArea|Qt::BottomDockWidgetArea);

    // 设置中心部件 只能有一个
    QTextEdit *edit = new QTextEdit(this);
    setCentralWidget(edit);



}

MainWindow::~MainWindow()
{
    delete ui;
}


P19

添加和引用资源文件

  1. 将图片文件,拷贝到项目位置下
  2. 右键项目->添加文件->Qt->Qt resource File -> 给资源起名字
  3. res生成res.qrc
  4. open in editor 编辑资源
  5. 添加前缀,添加文件
  6. 使用 “:+ 前缀名 + 文件名”
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

//    ui->actionnew->setIcon(QIcon("D:/project/QTday02/02_QtSource/qq.png"));

    // 使用qt的资源,": + 前缀名 + 文件名"
    ui->actionnew->setIcon(QIcon(":/Image/qq.png"));

}

MainWindow::~MainWindow()
{
    delete ui;
}


P20 对话框

分类

  1. 模态对话框 不可以对其他对话框进行操作 阻塞 使用exec
  2. 非模态对话框 可以对其他对话框进行操作 使用show
  3. 防止多次打开造成内存泄漏 dlg2->setAttribute(Qt::WA_DeleteOnClose);
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
#include<QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 点击新建 弹框
    connect(ui->actionnew, &QAction::triggered, [=](){
       //对话框 分类
       // 模态对话框(不可以对其窗口进行操作) 非模态对话框(可以对其他窗口操作)

       // 模态对话框
//       QDialog dlg(this);
//       dlg.resize(200, 100);
//       dlg.exec();
//       qDebug() << "模态对话框弹出了";

       // 非模态对话框
       QDialog *dlg2 = new QDialog(this);
       dlg2->resize(200, 100);
       dlg2->show();
       dlg2->setAttribute(Qt::WA_DeleteOnClose);
       qDebug() << "非模态对话框弹出了";

    });

}

MainWindow::~MainWindow()
{
    delete ui;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/82286.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于java(SSH)的数字迎新系统的设计与实现

目 录 摘 要 i Abstract ii 1 绪论 1 1.1 选题背景 1 1.2研究现状 1 1.3课题目的 1 1.4本文结构 2 2 设计技术与开发环境 3 2.1 相关技术介绍 3 2.1.1 Struts简介 3 2.1.2 Hibernate简介 3 2.1.3 spring简介 3 2.2.4 SSH的简介 3 2.2 开发环境介绍 5 2.2.1 Myeclipse简介 5 2.2…

linux只W25Q256驱动,使用m25p80,支持w25q系列nor flash

1.内核编译选项增加 (1&#xff09;Device Drivers/Memory Technology Device (MTD) support ---> (2)Device Drivers/Memory Technology Device (MTD) support /SPI-NOR device support ---> (3)Device Drivers/Memory Technology Device (MTD) support /SPI-NOR dev…

机器学习——期末复习

文章目录填空题第一章 机器学习基础第二章 数据预处理KNN算法支持向量机集成学习决策树聚类算法联结学习三种池化操作选择题计算题数据正规化Hopfield网络能量函数计算卷积、池化操作应用题决策树、朴素贝叶斯、聚类算法单层感知器构造&#xff08;连接神经元部分&#xff09;填…

unix 域套接字实现进程间通信

目录 1、认识域套接字 2、unix域套接字相关API及地址结构介绍 (1) 创建unix域套接字 (2) 填充地址结构 sockaddr_un 3、unix域套接字实现进程间通信&#xff08;以UDP为例&#xff09; 1、认识域套接字 和之前TCP / UDP 编程使用的套接字不同&#xff0c;域套接字常用于同…

01入门及简单应用-ReentrantReadWriteLock原理-AQS-并发编程(Java)

文章目录1 概述2 性质3 简单测试4 模拟数据缓存4.1 应用初始化无缓存4.2 加入缓存改造5 后记1 概述 ReentrantReadWriteLock 是读写锁&#xff0c;和ReentrantLock会有所不同&#xff0c;对于读多写少的场景使用ReentrantReadWriteLock 性能会比ReentrantLock高出不少。在多线程…

技术分享 | 测试平台开发-前端开发之数据展示与分析

测试平台的数据展示与分析&#xff0c;我们主要使用开源工具ECharts来进行数据的展示与分析。 ECharts简介与安装 ECharts是一款基于JavaScript的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表&#xff…

展锐Android 10平台OTA升级

OTA 整体升级包制作步骤&#xff08;以SC9863A平台为例&#xff09; 下载项目 AP 的代码。通过以下命令设置编译环境。 source build/envsetup.sh lunch kheader 通过 make 命令全编整个工程。进入“device/sprd/sharkle/sl8541e_1h10_32b/”目录&#xff08;board 对应目录&a…

5G无线技术基础自学系列 | 站点详细勘测

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 站点的勘测结果非常重要&#xff0c;直…

高压放大器在硅氧烷近晶相单体合成中的应用

实验名称&#xff1a;高压放大器在硅氧烷近晶相单体合成中的应用 研究方向&#xff1a;晶体材料 测试目的&#xff1a; 双稳态包括向列相双稳态、近晶&#xff21;相双稳态和胆甾相双稳态&#xff0c;目前主要的研究是在近晶&#xff21;相双稳态&#xff0c;由近晶&#xff21…

自动驾驶专题介绍 ———— 转向系统

文章目录转向系统转向器齿轮齿条式循环球式蜗杆曲柄指销式转向助力液压转向助力系统电动转向助力系统发展转向系统 转向系统是按照驾驶员的意图改变或保持汽车行驶方向的系统。根据转向能源的不同&#xff0c;可以将转向系统分为机械转向系统和动力转向系统。   1. 机械转向系…

188: vue+openlayers上传GeoJSON文件,导出CSV格式文件

第188个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers上传geojson文件,解析文件在地图上显示图形,同时利用上传的文件,获取features数据,整合重新配置格式,导出CSV(Comma Separated Values)形式的文件。如果文件仅包含点要素,则会添加经度和纬度列。 …

能源管理系统的主要功能|瑜岿科技|能源监测

能源管理系统利用过程控制技术、网络通信技术、教据库技术将分布在现场的数据采集监测站、现场控制站以及管理控制中心联系了起来&#xff0c;实现对企业生产数据采集、存储、处理、统计、查询及分析的功能&#xff0c;以及对企业生产数据的监控、分析和诊断&#xff0c;通过对…

Dynamic Few-Shot Visual Learning without Forgetting

摘要 人类视觉系统有显著的能力去毫不费力的从零样本示例中学习新颖概念。机器学习视觉系统上模仿相同的行为是一个有趣的非常具有挑战性的研究问题&#xff0c;这些研究问题有许多实际的优势在真实世界视觉应用上。在这篇文章中&#xff0c;我们目标是去设计一个零样本视觉学…

mysql中MVCC--多版本并发控制

读读:不存在任何安全问题&#xff0c;不需要并发控制 读写:有线程安全问题&#xff0c;脏读、幻读、不可重复读 写写:有线程安全问题&#xff0c;更新丢失 为了解决读写的并发问题 什么是MVCC 只有InnoDB引擎支持mvcc&#xff0c;mysql默认支持可重复读&#xff0c;就是依赖…

常用数据库之mysql的搭建与使用

1. 简介 mysql为关系型数据库&#xff0c;是由瑞典的MySQLAB公司开发的&#xff0c;但是几经辗转&#xff0c;现在是Oracle产品。它是以“客户&#xff0f;服务器”模式实现的&#xff0c;是一个多用户、多线程的小型数据库服务器。而且MySQL是开源数据的&#xff0c;任何人都可…

Qt 模型视图编程之自定义只读数据模型

背景 Qt 中的模型视图架构是用来实现大量数据的存储、处理及其显示的&#xff0c;主要原理是将数据的存储与显示分离&#xff1a;模型定义了标准接口对数据进行访问&#xff1b;视图通过标准接口获取数据并定义显示方式&#xff1b;模型使用信号与槽机制通知视图数据变化。 Q…

基于Java Web技术的动车购票系统

毕 业 设 计 中文题目基于Java Web技术的动车购票系统英文题目Train ticket system based on Web JavaTechnology毕业设计诚信声明书 本人郑重声明&#xff1a;在毕业设计工作中严格遵守学校有关规定&#xff0c;恪守学术规范&#xff1b;我所提交的毕业设计是本人在 指导教师…

零入门容器云网络-7:基于golang编程实现给ns网络命名空间添加额外的网卡

已发表的技术专栏&#xff08;订阅即可观看所有专栏&#xff09; 0  grpc-go、protobuf、multus-cni 技术专栏 总入口 1  grpc-go 源码剖析与实战  文章目录 2  Protobuf介绍与实战 图文专栏  文章目录 3  multus-cni   文章目录(k8s多网络实现方案) 4  gr…

“美亚杯”第三届中国电子数据取证大赛答案解析(个人赛)

试题 1 Gary的笔记本电脑已成功取证并制作成镜像 (Forensic Image)&#xff0c;下列哪个是其MD5哈希值。 A. 0CFB3A0BB016165F1BDEB87EE9F710C9 B. 5F1BDEB87EE9F710C90CFB3A0BB01616 C. A0BB016160CFB3A0BB0161661670CFB3 D. 16160CFB3A0BB016166A0BB0161661…

独立产品灵感周刊 DecoHack #041 - 那些独立开发者是怎么养活自己的

本周刊记录有趣好玩的独立产品设计开发相关内容&#xff0c;每周发布&#xff0c;往期内容同样精彩&#xff0c;感兴趣的伙伴可以点击订阅我的周刊。为保证每期都能收到&#xff0c;建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。 &#x1f4bb; 产品推荐 1. SOCCER STREAM…