QT基础学习笔记

文章目录

  • 1 概述
    • 1.1 优点
    • 1.2 QT成功使用案例
    • 1.3 安装教程
      • 1.3.1 在线安装流程
      • 1.3.2 离线安装流程
  • 2 创建工程
    • 2.1 快捷键
      • 2.1.1 常用快捷键
      • 2.1.2 修改快捷键
    • 2.2 proj文件
  • 3 对象树
  • 4 信号和槽
    • 4.1 自定义信号和槽
      • 4.1.1 信号连接信号
      • 4.1.2 一个信号连接多个槽函数
      • 4.1.3 多个信号连接同一个槽函数
      • 4.1.3 信号和槽函数的参数列表必须一一对应,但是信号的参数个数可以多于槽
      • 4.1.4 断开信号
    • 4.2 QT4版本的信号和槽
    • 4.3 lambda表达式
      • 4.3.1 mutable关键字
      • 4.3.2 返回值
      • 4.3.3 利用lambda表达式实现槽函数功能
    • 4.4 小结
  • 5 控件
    • 5.1 窗口
      • 5.1.1 菜单栏
      • 5.1.2 工具栏
      • 5.1.3 状态栏
    • 5.2 PushButton
    • 5.3 对话框
      • 5.3.1 模态对话框
      • 5.3.2 非模态对话框
      • 5.3.3 消息对话框
        • 5.3.3.1 消息对话框是模态对话框
        • 5.3.3.2 使用案例
      • 5.3.4 颜色对话框
      • 5.3.4 文件对话框
      • 5.3.4 字体对话框
    • 5.4 按钮组
      • 5.4.1 Radio button
      • 5.4.2 Check box
    • 5.5 ListWidget
    • 5.6 TableWidget
    • 5.7 ComboBox
    • 5.8 封装自定义控件
      • 5.8.1 添加一个新的Widget类
      • 5.8.2 设计自定义的控件
      • 5.8.3 界面引用自定义的控件
      • 5.8.4 实现自定义控件功能
  • 6 事件
    • 6.1 鼠标Event
    • 6.2 定时器
      • 6.2.1 Event方式
      • 6.2.1 QTimer对象
    • 6.3 事件分发器
    • 6.4 事件过滤器
      • 6.4.1 使用步骤
      • 6.4.2 代码示例
  • 7 资源文件
    • 7.1 添加使用资源文件
  • 8 国际化
    • 8.1 操作步骤
  • 9 参考资料

1 概述

1.1 优点

  • 跨平台,几乎支持所有的平台
  • 接口设计良好,使用简单
  • 一定程度上简化了内存回收机制
  • 开发效率高,能够快速的构建应用程序。
  • 社区氛围良好,市场份额上升
  • 支持嵌入式开发

1.2 QT成功使用案例

  • Linux桌面环境KDE
  • WPS office软件
  • Skype网络电话
  • Google Earth
  • VLC多媒体播放器
  • VirtualBox

1.3 安装教程

从5.15之后了都是在线安装了。

1.3.1 在线安装流程

在线安装流程:
https://blog.csdn.net/Python_0011/article/details/131699443

1.3.2 离线安装流程

【选择组件】
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 创建工程

2.1 快捷键

2.1.1 常用快捷键

Go back: Alt + Left 返回,光标上一次到的那个位置,如从一个文本到了另一个中。
Go Forward: Alt + Right前进

2.1.2 修改快捷键

有时Qt Creator快捷键与系统中的快捷键冲突了,可以自定义或者修改原来的快捷键,步骤如下: 工具-》选项-》环境-》键盘-》,此处比如切换书签的快捷键,Ctrl+M显示红色,就说明冲突了,我们选中这一行,点击Record重新记录,再点击Apply和OK即可

2.2 proj文件

在这里插入图片描述

3 对象树

在这里插入图片描述

4 信号和槽

4.1 自定义信号和槽

  • 定义信号
    singals后面的函数都可以作为信号,信号只有声明,没有实现。
class Teacher : public QObject
{Q_OBJECT
public:explicit Teacher(QObject *parent = nullptr);signals:void hungry();void hungry(QString foodName);
};
  • 定义槽
    public slots后面的函数都可以作为slot,slot需要有实现。
class Student : public QObject
{Q_OBJECT
public:explicit Student(QObject *parent = nullptr);signals:public slots:void treat();void treat(QString foodName);
};
void Student::treat()
{qDebug() << "请老师吃饭";
}void Student::treat(QString foodName) {qDebug() << "请老师吃饭, 老师要吃" << foodName.toUtf8().data();
}
  • 建立连接

调用connect函数建立连接。

void (Teacher::*hungryMethod)(QString) = &Teacher::hungry;
void (Student::*treatMethod)(QString) = &Student::treat;connect(teacher, hungryMethod, student, treatMethod);
  • 发出信号
void MainWindow::classOver() {emit this->teacher->hungry("Noodles");
}

【自定义信号或者槽出现重载的情况的解决】

使用函数指针的方式来明确指向的函数的地址。

void (Teacher::*hungryMethod)(QString) = &Teacher::hungry;
void (Student::*treatMethod)(QString) = &Student::treat;

【一个小知识点:QString转为char*】

void Student::treat(QString foodName) {qDebug() << "请老师吃饭, 老师要吃" << foodName.toUtf8().data();
}

4.1.1 信号连接信号

 //信号连接信号
void (Teacher::*hungryMethodPure)(void) = &Teacher::hungry;
void (Student::*treatMethodPure)(void) = &Student::treat;
connect(teacher, hungryMethodPure, student, treatMethodPure);
connect(classOverButton, &QPushButton::clicked, teacher, hungryMethodPure);

4.1.2 一个信号连接多个槽函数

4.1.3 多个信号连接同一个槽函数

4.1.3 信号和槽函数的参数列表必须一一对应,但是信号的参数个数可以多于槽

不匹配的情况下会报如下错误:
在这里插入图片描述

4.1.4 断开信号

disconnect(classOverButton, &QPushButton::clicked, teacher, hungryMethodPure);

4.2 QT4版本的信号和槽

在这里插入图片描述
【优点】
参数直观
【缺点】
编译器不会检测参数类型

4.3 lambda表达式

4.3.1 mutable关键字

    //mutable关键字表示可以修改值传递的变量,但是修改的是拷贝,并不是变量本身QPushButton* myBtn = new QPushButton(this);QPushButton* myBtn2 = new QPushButton(this);myBtn2->move(100, 100);int m = 10;connect(myBtn, &QPushButton::clicked, this, [m]()mutable {m = 110; qDebug() << m;});connect(myBtn2, &QPushButton::clicked, this, [=](){qDebug() << m;});qDebug() << m;

4.3.2 返回值

void testReturnInLambda() {int ret = []()->int{return 1000;}();qDebug() << "ret = " << ret;
}

4.3.3 利用lambda表达式实现槽函数功能

/*** @brief testOnButtonClick,利用lambda表达式实现槽函数功能** @param mainWindow*/
void testOnButtonClick(MainWindow* mainWindow) {QPushButton* button = new QPushButton("Clock window", mainWindow);button->move(100, 100);mainWindow->connect(button, &QPushButton::clicked, mainWindow, [=](){mainWindow->getStudent()->treat("Coco cola");mainWindow->close();});
}

4.4 小结

在这里插入图片描述

5 控件

5.1 窗口

在这里插入图片描述
在这里插入图片描述

5.1.1 菜单栏

最多只有一个

5.1.2 工具栏

可以有多个

5.1.3 状态栏

5.2 PushButton

5.3 对话框

在这里插入图片描述

5.3.1 模态对话框

不可以操作其他窗口了。

void showModeDialog(QWidget* parent) {QDialog dialog(parent);dialog.resize(200, 100);dialog.exec();
}

5.3.2 非模态对话框

还可以操作其他窗口

void showNoneModeDialog(QWidget* parent) {QDialog* dialog = new QDialog(parent);dialog->resize(200, 100);dialog->setAttribute(Qt::WA_DeleteOnClose);dialog->show();
}

5.3.3 消息对话框

5.3.3.1 消息对话框是模态对话框

在这里插入图片描述

5.3.3.2 使用案例
void showMessageBox(QWidget* parent, int dialogType) {switch (dialogType) {case 1:{QMessageBox::critical(parent, "critial", "critial happened");break;}case 2:{QMessageBox::information(parent, "information", "information happened");break;}case 3:{QMessageBox::StandardButton result = QMessageBox::question(parent, "ques", "question happened", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);if (result == QMessageBox::Yes) {qDebug() << "Yes";} else {qDebug() << "No";}break;}case 4:{QMessageBox::warning(parent, "warning", "warning happened");break;}default:QMessageBox::critical(parent, "critial", "critial happened");break;}
}

5.3.4 颜色对话框

void showColorDialog(QWidget* parent) {QColor color = QColorDialog::getColor(QColor(255, 0, 0));QString str = QString("[%1, %2, %3]").arg(color.red()).arg(color.green()).arg(color.blue());qDebug() << str;
}

5.3.4 文件对话框

void showFileDialog(QWidget* parent) {QString filePath = QFileDialog::getOpenFileName(parent, "Sk Open File", "C:\\Users\\imt2047\\Desktop", "(*.png)");qDebug() << filePath;
}

5.3.4 字体对话框

void showFontDialog(QWidget* parent) {bool flag;QFont font = QFontDialog::getFont(&flag, QFont("Times New Roman", 14));QString res = QString("Family:%1, Size:%2, Bold:%3, Italic:%4").arg(font.family()).arg(font.pointSize()).arg(font.bold()).arg(font.italic());qDebug() << res;
}

5.4 按钮组

5.4.1 Radio button

设置默认选中

ui->rBtnMan->setChecked(true);

5.4.2 Check box

在这里插入图片描述

5.5 ListWidget

void MainWindow::initListWidget() {
//    QListWidgetItem* item = new QListWidgetItem("Hello hello, jin gou bei, jin goubei");
//    item->setTextAlignment(Qt::AlignHCenter);
//    ui->listWidget->addItem(item);QStringList list;list << "Hello hello, jin gou bei, jin goubei" << "Hello hello, jin gou bei, jin goubei"<< "Hello hello, jin gou bei, jin goubei" << "Hello hello, jin gou bei, jin goubei";ui->listWidget->addItems(list);
}

5.6 TableWidget

void MainWindow::initTableWidget() {ui->tableWidget->setColumnCount(3);ui->tableWidget->setRowCount(5);ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"Name" << "Sex" << "Age");QStringList nameList;nameList << "yase" << "zhoayun" << "zhangfei" << "guanyu" << "huamulan";QList<QString> sexList;sexList<< "Male" << "Male" << "Male" << "Male" << "Female";for (int i = 0; i < 5; i++) {int columnIndex = 0;ui->tableWidget->setItem(i, columnIndex++, new QTableWidgetItem(nameList[i]));ui->tableWidget->setItem(i, columnIndex++, new QTableWidgetItem(sexList[i]));ui->tableWidget->setItem(i, columnIndex++, new QTableWidgetItem(QString::number(i)));}
}

5.7 ComboBox

void MainWindow::initComboBox() {ui->comboBox->addItem("Benz");ui->comboBox->addItem("BMW");ui->comboBox->addItem("125 Moto");connect(ui->selectCarPushButton, &QPushButton::clicked, this, [=](){// ui->comboBox->setCurrentIndex(2);ui->comboBox->setCurrentText("BMW");});
}

5.8 封装自定义控件

5.8.1 添加一个新的Widget类

在这里插入图片描述

5.8.2 设计自定义的控件

拖拖拽拽
在这里插入图片描述

5.8.3 界面引用自定义的控件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.8.4 实现自定义控件功能

spinbox和slider联动。

void SmallWidget::setValue(int value) {ui->spinBox->setValue(value);
}int SmallWidget::getValue() {return ui->spinBox->value();
}void SmallWidget::initBaseFunction() {// SpinBox数值变化,Slider跟随滑动void (QSpinBox::* valueChangedSignal)(int) = &QSpinBox::valueChanged;connect(ui->spinBox, valueChangedSignal, ui->horizontalSlider, &QSlider::setValue);// Slider滑动,SpinBox跟随数值变化connect(ui->horizontalSlider, &QSlider::valueChanged, ui->spinBox, &QSpinBox::setValue);
}

6 事件

6.1 鼠标Event

#ifndef MYLABEL_H
#define MYLABEL_H#include <QLabel>
#include <QDebug>
#include <QMouseEvent>class MyLabel : public QLabel
{Q_OBJECT
public:explicit MyLabel(QWidget* parent = 0);/*** @brief enterEvent: 覆写基类方法* @param event*/void enterEvent(QEvent *event);void leaveEvent(QEvent *event);void mousePressEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);void mouseDoubleClickEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);
};#endif // MYLABEL_H
#include "mylabel.h"MyLabel::MyLabel(QWidget* parent):QLabel(parent)
{// 开启鼠标追踪setMouseTracking(true);
}void MyLabel::enterEvent(QEvent *event) {qDebug() << "mouse in in la.";
}void MyLabel::leaveEvent(QEvent *event) {qDebug() << "mouse out out la.";
}void MyLabel::mousePressEvent(QMouseEvent *event) {// 如果鼠标左键和右键按下,提示信息QString string = QString("Mouse click happened");if (event->button() == Qt::LeftButton) {string = QString("Mouse left button click, x = %1, y = %2").arg(event->x()).arg(event->y());} else if (event->button() == Qt::RightButton) {string = QString("Mouse right button click, x = %1, y = %2").arg(event->x()).arg(event->y());} else {}qDebug() << string;
}void MyLabel::mouseReleaseEvent(QMouseEvent *event) {QString string = QString("Mouse release, x = %1, y = %2").arg(event->x()).arg(event->y());qDebug() << string;
}void MyLabel::mouseDoubleClickEvent(QMouseEvent *event) {QString string = QString("Mouse double click, x = %1, y = %2").arg(event->x()).arg(event->y());qDebug() << string;
}void MyLabel::mouseMoveEvent(QMouseEvent *event){if (event->buttons() & Qt::LeftButton) {QString string = QString("Mouse moving, x = %1, y = %2").arg(event->x()).arg(event->y());qDebug() << string;}
}

6.2 定时器

6.2.1 Event方式

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QDebug>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void timerEvent(QTimerEvent* event);private:Ui::MainWindow *ui;int timerId1;int timerId2;void onTimer1Event(QTimerEvent* event);void onTimer2Event(QTimerEvent* event);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 启动定时器timerId1 = startTimer(1000);timerId2 = startTimer(2000);
}void MainWindow::timerEvent(QTimerEvent* event) {if (event ->timerId() == timerId1) {onTimer1Event(event);} else if (event->timerId() == timerId2) {onTimer2Event(event);}
}void MainWindow::onTimer1Event(QTimerEvent* event) {static int num = 1;ui->label->setText(QString::number(num++));
}void MainWindow::onTimer2Event(QTimerEvent* event) {static int num = 1;ui->label_2->setText(QString::number(num++));
}

6.2.1 QTimer对象

void startQTimer(MainWindow* parent) {QTimer* timer = new QTimer(parent);parent->connect(timer, &QTimer::timeout, parent, [=](){static int num = 1;parent->getUi()->label_3->setText(QString::number(num++));});timer->start(500);parent->connect(parent->getUi()->pauseButton, &QPushButton::clicked, parent, [=](){timer->stop();});parent->connect(parent->getUi()->resumeButton, &QPushButton::clicked, parent, [=](){timer->start(500);});
}

6.3 事件分发器

bool MyLabel::event(QEvent *e) {// 拦截处理鼠标按下事件if (e->type() == QEvent::MouseButtonPress) {QMouseEvent* event = static_cast<QMouseEvent*>(e);handleMousePressEvent(event, "event()");return true;}// 交给父类处理return QLabel::event(e);
}

6.4 事件过滤器

6.4.1 使用步骤

  1. 控件安装事件过滤器
  2. 覆写eventFilter函数。

6.4.2 代码示例

void MainWindow::initLabel() {//1. install event filterui->label->installEventFilter(this);
}
/*** 2. override eventFilter** @brief MainWindow::eventFilter* @param object* @param e* @return*/
bool MainWindow::eventFilter(QObject* object, QEvent* e) {if (object == ui->label) {// 拦截处理鼠标按下事件if (e->type() == QEvent::MouseButtonPress) {QMouseEvent* event = static_cast<QMouseEvent*>(e);handleMousePressEvent(event, "eventFilter()");return true;}}return QMainWindow::eventFilter(object, e);
}

7 资源文件

7.1 添加使用资源文件

  • 将资源文件拷贝到目录中
    在这里插入图片描述

  • 创建资源文件(qrc文件)
    在这里插入图片描述

  • 编辑资源文件
    添加前缀,添加文件。
    在这里插入图片描述

  • 使用资源文件

void MainWindow::initFileMenuItems() {QAction* newAction = new QAction("New");//使用QT资源: : + 前缀名 + 资源名newAction->setIcon(QIcon(":/image/robot_hand.svg"));this->fileMenuItems.append(newAction);this->fileMenuItems.append(new QAction("Open"));
}

8 国际化

8.1 操作步骤

  1. 生成ts文件
  • pro文件增加内容
TRANSLATIONS = ListTableWidgetTest_EN.ts \ListTableWidgetTest_CN.ts
  • 使用lupdate生成ts文件
    在这里插入图片描述
  • 查看生成的ts文件
    生成的文件就在工程目录中。ts文件就是xml文件。
    在这里插入图片描述
  1. 生成qm文件
    使用linguist生成。
    在这里插入图片描述
  2. 代码中加载qm文件,安装translator,retranslateUi
void MainWindow::on_selectLanguangeComboBox_activated(int index)
{switch(index) {// chinesecase 0:translator->load(":/language/res/ListTableWidgetTest_CN.qm");isChinese = true;break;// englishcase 1:translator->load(":/language/res/ListTableWidgetTest_EN.qm");isChinese = false;break;default:break;}qApp->installTranslator(translator);ui->retranslateUi(this);
}
  1. 注意ComboBox
    retranslateUi刷新UI的时候,会把组合框默认选择第一个。如果同组合框切换语言的时候,要处理下这个选择框。
    解决办法就是记录全局变量,记录每一次选择的原因。 如果组合框因为刷新的原因发生了不一致,就根据全局变量重新恢复。
void MainWindow::changeEvent(QEvent *e) {switch (e->type()) {case QEvent::LanguageChange:ui->retranslateUi(this);if (!isChinese && ui->comboBox->currentIndex() == 0) {ui->selectLanguangeComboBox->setCurrentIndex(1);}break;default:break;}
}

9 参考资料

[1] https://www.bilibili.com/video/BV1g4411H78N/?p=11&spm_id_from=pageDriver&vd_source=f4dcb991bbc4da0932ef216329aefb60
[2] https://blog.csdn.net/weixin_51081223/article/details/121671615
[3] https://cloud.tencent.com/developer/article/2245901
[4] https://blog.csdn.net/ihmhm12345/article/details/127408975
[5] 创建PyQT项目: https://www.pythonguis.com/tutorials/first-steps-qt-creator/
[6] ui转换为py,并生成exe: https://www.cnblogs.com/linyfeng/p/11223707.html

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

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

相关文章

算法---缺失的第一个正数

题目 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。示例 1&#xff1a;输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 示例 2&#xff1a;输入&#xff1a;nums …

C++数据结构算法篇Ⅰ

C数据结构算法篇Ⅰ &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C算法 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 主要内容讲解数据结构中的链表结构 文章目录 C数据…

WSL安装Ubuntu

先安装wsl2 安装Ubuntu 打开windows商店&#xff0c;搜索对应版本的Ubuntu&#xff0c;点击获取进度跑完后&#xff0c;点击打开&#xff0c;就可以完成安装 删除Ubuntu版本 wsl --unregister Ubuntu-18.04安装位置迁移 正常情况下Ubuntu是被安装在C盘&#xff0c;我们需要…

什么是数字展览馆,数字展览馆有什么应用前景

引言&#xff1a; 数字展览馆作为一种新兴的文化艺术展示形式&#xff0c;以数字化技术和虚拟现实为基础&#xff0c;正在逐渐改变传统展览的方式。 一、什么是数字展览馆&#xff1f; 1.定义 数字展览馆是利用数字技术和虚拟现实技术打造的一种线上文化艺术展示平台。通过虚…

@reduxjs/toolkit配置react-redux解决createStore或将在未来被淘汰警告

通常 我们用redux都需要通过 createStore 但目前 你去用它 基本都会被划线 甚至有点厉害的的编辑器 他会直接告诉你这个东西基本快被弃用了 这个应该大家都知道 最好不要用已经被明确未来或弃用的语法 因为一旦弃用这个系统就需要维护 而且说 一般会被淘汰的语法 本身也就是有…

2023年免费CRM软件盘点:14款热门工具全面比较(含开源)

在初创企业或小型企业阶段&#xff0c;特别是在预算有限且客户管理需求较为基础的情境下&#xff0c;使用免费的CRM系统通常是一个理智的选择。这类系统虽然在功能上可能不如付费版本丰富&#xff0c;但基本的客户信息管理、销售跟踪和沟通记录等核心功能通常都能满足需求。 对…

玩了一下 Jenkins,最新版本 + JDK11

背景 今年五月的时候玩了一下 Jenkins&#xff0c;最新版本 2.414.3 &#xff0c;JDK 11 。本机有两个 JDK&#xff0c;只放到 Tomcat 里面了&#xff0c;看到了一个启动页面&#xff0c;后面有其他事情就忘记了。最近又想起来&#xff0c;觉得还是应该玩一下这么有技术含量的…

PTA 函数题(C语言)-- 阶乘计算升级版

题目title&#xff1a; 阶乘计算升级版 题目作者&#xff1a; 陈越 浙江大学 本题要求实现一个打印非负整数阶乘的函数。 函数接口定义&#xff1a; void Print_Factorial ( const int N ); 其中N是用户传入的参数&#xff0c;其值不超过1000。如果N是非负整数&#…

数据结构和算法——用C语言实现所有图状结构及相关算法

文章目录 前言图的基本概念图的存储方式邻接矩阵邻接表十字链表临界多重表 图的遍历最小生成树普里姆算法&#xff08;Prim&#xff09;克鲁斯卡尔算法&#xff08;Kruskal&#xff09; 最短路径BFS求最短路径迪杰斯特拉算法&#xff08;Dijkstra&#xff09;弗洛伊德算法&…

chorme安装esay scholar及chrome 无法从该网站添加应用、扩展程序和用户脚本解决方案

问题描述 如题&#xff0c;博主想安装easy scholar用于查询论文的分区&#xff0c;结果安装了半天一直出现chrome 无法从该网站添加应用、扩展程序和用户脚本解决方案的问题。 解决方案 先从这个网址下载&#xff1a;https://www.easyscholar.cc/download 然后对下载好的文…

MFC网络通信-Udp服务端

目录 1、UI的布局 2、代码的实现&#xff1a; &#xff08;1&#xff09;、自定义的子类CServerSocket &#xff08;2&#xff09;、重写OnReceive事件 &#xff08;3&#xff09;、在CUdpServerDlg类中处理 &#xff08;4&#xff09;、在OnInitDialog函数中 &#xff0…

图解Kafka高性能之谜(五)

高性能的多分区、冗余副本集群架构 高性能网络模型NIO 简单架构设计&#xff1a; 详细架构设计&#xff1a; 高性能的磁盘写技术 高性能的消息查找设计 索引文件定位使用跳表的设计 偏移量定位消息时使用稀疏索引&#xff1a; 高响应的磁盘拷贝技术 kafka采用sendFile()的…

Qwt QwtPolarPlot类使用

1.概述 QwtPolarPlot是Qwt库中用于绘制极坐标图的类。它继承自QwtPolarItemDict和QFrame类&#xff0c;并且可以作为QwtPlot控件的一部分使用。 以下是类的继承关系图&#xff1a; 2.常用方法 设置标签&#xff1a; void setTitle (const QString &)void setTitle (con…

MFC网络编程-Udp客户端

目录 1、UI的设计&#xff1a; 2、代码的实现&#xff1a; &#xff08;1&#xff09;、重写CSocket虚函数OnReceive&#xff0c;并且传入对话框的指针 &#xff08;2&#xff09;、初始化SOCKET &#xff08;3&#xff09;、绑定本地IP和端口 &#xff08;4&#xff09;、…

LabVIEW开发双目立体系统猪重估算

LabVIEW开发双目立体系统猪重估算 动物的活重是各种研究中的重要参考&#xff0c;例如动物生长&#xff0c;饲料转化率&#xff0c;健康状况和疾病发生。生长中的动物的体重为保持它们处于适当的营养和环境水平提供了一个有价值的参数或指标。动物的利润通常与收入和成本之间的…

LCD驱动程序——Framebuffer应用编程

1.LCD 操作原理 在 Linux 系统中通过 Framebuffer 驱动程序来控制 LCD。Frame 是帧的意思&#xff0c;buffer 是缓冲的意思&#xff0c;这意味着 Framebuffer 就是一块内存&#xff0c;里面保存着一帧图像。Framebuffer 中保存着一帧图像的每一个像素颜色值&#xff0c;假设 L…

程序环境和预处理

目录 1. 程序的翻译环境和执行环境 2. C语言程序的编译链接 2.1. 预处理 2.2. 编译 2.3. 汇编 2.4. 链接 3. 运行环境的简单介绍 4. 预定义符号介绍 5. 预处理指令 #define 5.1. #define定义标识符 5.2. #define定义宏 5.3. #define替换规则 6. 宏和函数的对比 1. …

带你从0开始学习自动化框架Airtest

现在市面上做UI自动化的框架很多&#xff0c;包括我们常用的Web自动化框架Selenium&#xff0c;移动端自动化框架Appium。 虽然Selenium和Appium分属同源&#xff0c;而且API都有很多相同的地方&#xff0c;可以无损耗切换&#xff0c;但是还是需要引入不同的库&#xff0c;而…

Debug技巧-不启用前端访问后端

在日常开发中&#xff0c;我们经常会遇到各种问题需要调试&#xff0c;前后端都启动需要耗费一定的时间和内存&#xff0c;方便起见&#xff0c;可以直接用抓包数据访问后端&#xff0c;这里我们需要用到Postman或者ApiFox 抓包数据 在系统前台触发后端请求&#xff0c;在控制…

【MATLAB第81期】基于MATLAB的LSTM长短期记忆网络预测模型时间滞后解决思路(更新中)

【MATLAB第81期】基于MATLAB的LSTM长短期记忆网络预测模型时间滞后解决思路&#xff08;更新中&#xff09; 在LSTM预测过程中&#xff0c;极易出现时间滞后&#xff0c;类似于下图&#xff0c;与一个以上的样本点结果错位&#xff0c;产生滞后的效果。 在建模过程中&#xf…