Qt--实战小经验

Qt外部调用进程类QProcess的使用 可以看到关闭后触发了对应finished()信号,然后通过打印可以看到状态从打开到关闭的变化情况是:1(Starting)->2(Running)->0(NotRunning)。并且触发finished()信号时由于进程已经关闭,所以获取不到对应的进程id,但是stateChanged(NotRunning)会先于finished(),并且这时进程没有完全关闭所有能获取到对应进程id。:是一个指向字符指针数组的指针,其中每个元素是一个指向表示一个命令行参数的C风格字符串的指针。 阅读详情

目录

1、判断字符串是不是数字

2、设置按钮背景图状态(鼠标悬浮,鼠标按下)

3、保留n位有效数字或小数

4、解决因代码存在中文导致出现“常量中有换行符”的错误

5、Qt之QPushButton实现文本省略...

6、通过读取文件设置qss

7、手动计算进度条百分比

8、传参设置字体

9、杀死第三方软件或后台进程

10、lineEdit限制输入特殊字符并设置密码输入模式

11、tableview设置某行的一个项无法被选择

12、获取函数运行的时间

13、取消当前项被选中后的颜色

14、提取QString字符串中的所有数字

15、Qt Creator与vsaddin下载地址

16、事件过滤器(注册事件)

17、Qt定时器的使用

18、秒-转换为时分秒

19、获取本机ip

20、编码转换


周末优化了一下博客,把之前记录经验式的文章集合到这个地方,方便自己和大家查看。

1、判断字符串是不是数字

通过QString的方法toDouble()来判断字符串是不是数字。

bool flag=false;
 
QString str="8.8";
 
double d=-1;
 
d=str.toDouble(&flag);
qDebug()<<d;        //输出8.8
qDebug()<<flag;    //输出true

如果str是字符,比如str="abc",那么d会输出0,flag为false。

2、设置按钮背景图状态(鼠标悬浮,鼠标按下)

ui->qToolButton->setStyleSheet("QToolButton{border-image:url(:/image/nor.png);}" //正常
                               "QToolButton:hover{border-image:url(:/image/sel.png);}" //鼠标悬浮
                               "QToolButton:pressed{border-image:url(:/image/pre.png);}" //鼠标按下
                              );

3、保留n位有效数字或小数

保留n位有效数字:

double num=9.87654;
QString str=QString("%1").arg(num,0,'G',4); //保留四位有效数字,会进行四舍五入
qDebug()<<str; //输出9.877

保留n位小数:

double value=1.2345;
QString lastValue=QString::number(value,'f',2); //保留2位小数

4、解决因代码存在中文导致出现“常量中有换行符”的错误

在文件开头加上这句 

#pragma execution_character_set("utf-8")

  然后在notepad++上将文件编码设置为utf-8格式,关掉Qt Createor再重新打开,或者重新编译就好了。

  如果设置完上述还是不行,需要在notepad++上将文件编码设置为utf-8-BOM即可

5、Qt之QPushButton实现文本省略...

QFontMetrics elideFont(ui->pushButton->font());
ui->pushButton->setText(elideFont.elidedText(ui->pushButton->text(), Qt::ElideRight, ui->pushButton->width()));

6、通过读取文件设置qss

QFile file(":/qss/test.qss");
if(!file.open(QFile::ReadOnly))
{
    return -1;
}
 
QString style = file.readAll();
this->setStyleSheet(style);
file.close();

7、手动计算进度条百分比

ui->valuelab->setText(QString("%1%").arg(ui->progressBar->value()*100/ui->progressBar->maximum()));

需要注意的是,value()和maximum()返回的是int类型,如果文件过大,因为int取值范围有限,会导致value*100后再除maximum后出现越界,导致显示异常。

可以将其转换为double后再除,然后再转换为int显示。

8、传参设置字体

void setFont(QString font)
{
    ui->label->setStyleSheet(QString("font-family:\"%1\";color:#FFFFFF").arg(font));
}

9、杀死第三方软件或后台进程

QProcess类是Qt提供的启动外部程序的类,通过start()接口运行指定的程序。tasklist表示打开进程列表,通过contains()查找进程列表返回的字符串中是否存在 需要kill的进程号 或者 程序名字。

QProcess process;
process.start("tasklist");
if (process.waitForFinished())
{
    QByteArray result = process.readAllStandardOutput();
    QString PidStr = QString::fromLocal8Bit(result);
	//if (PidStr.contains("2468")) //已知进程号
		//process.execute("taskkill", QStringList() << "-pid" << 2468 << "-f");
 
	if (PidStr.contains("kill.exe")) //已知程序名
		process.execute("taskkill", QStringList() << "-im" << "kill.exe" << "-f");
}

10、lineEdit限制输入特殊字符并设置密码输入模式

//限制以下特殊符号在lineEdit中的输入
QRegExp rx = QRegExp("[^,。;;.、‘//]*");
QRegExpValidator *validator = new QRegExpValidator(rx);
ui->lineEdit->setValidator(validator);
 
//设置密码输入
ui->lineEdit->setEchoMode(QLineEdit::Password);
ui->lineEdit->setMaxLength(12);

11、tableview设置某行的一个项无法被选择

//绑定值到视图中
model->setItem(0,0,new QStandardItem(ui->num1->text()));
model->setItem(0,1,new QStandardItem(ui->comboBox->currentText()));
model->setItem(0,2,new QStandardItem(ui->num2->text()));
model->setItem(0,3,new QStandardItem(QString::number(result)));
 
//设置第二项不被选择
QStandardItem*item=model->item(0,2);
item->setFlags(item->flags()&~Qt::ItemIsSelectable);

12、获取函数运行的时间

#include <QApplication>
#include <QTime>
#include <QDebug>
 
int main(int argc,char *argv[])
{
    QApplication a(argc,argv);
 
    QTime t;
 
    t.start();//将此时间设置为当前时间
 
    for(int i=0;i<100;++i)
    {
        qDebug()<<i<<endl;
    }
 
    //elapsed(): 返回自上次调用start()或restart()以来经过的毫秒数
    qDebug()<<t.elapsed()<<"ms";
 
    return a.exec();
}

13、取消当前项被选中后的颜色

实际开发中,当我们点击tableview的某个item项(如更改该项的背景色),当更改完成后,此项仍然是被选择状态时的颜色,不便于观察修改后的背景色。

通过以下几句代码,可以取消当前项被选中的状态:

QModelIndex Index = ui.tableView->selectionModel()->currentIndex();
ui.tableView->selectionModel()->setCurrentIndex(Index, QItemSelectionModel::Deselect);
​

14、提取QString字符串中的所有数字

QRegExp rx("(\\d+)");
QString str = "data:16 99";
QStringList list; //存储数字
int p=0;
 
while((p = rx.indexIn(str,p)) != -1)
{
    list<<rx.cap(1);
    p += rx.matchedLength();
}

15、Qt Creator与vsaddin下载地址

Qt Creator

Index of /archive/qt

qt-vsaddin

Index of /official_releases/vsaddin

Qt Visual Studio Tools - Visual Studio Marketplace

16、事件过滤器(注册事件)

先为ui控件注册,通过下面的代码:

//为groupBox控件注册事件
ui->groupBox->installEventFilter(this);

然后重写eventFilter(QObject* obj,QEvent *event)事件即可,这样子,只有双击groupBox这个部件,才会触发条件,双击其他的位置没有反应。

bool MainView::eventFilter(QObject *obj,QEvent *event)
{
    if(obj == ui->groupBox)
    {
        if(event->type() == QEvent::MouseButtonDblClick)    //双击
        {
            //处理逻辑
            return false;
        }
    }
 
    return QObject::eventFilter(obj,event);
}

17、Qt定时器的使用

这里使用QTimer类来实现定时器,通过信号和槽机制实现定时效果。

通过timeout()信号连接到相应的槽,对象调用start()后,将以固定的时间间隔(start()括号中的数字)发射timeout()信号。

当某些时候不便使用多线程时,可以使用定时器来实现多线程的效果。

以下是具体实现程序,功能是,当label控件显示的数字到达60后,从0开始继续计数:

widget.cpp

#include "widget.h"
#include "ui_widget.h"
 
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
 
    t=new QTimer(this);
 
    t->start(1000);
 
    connect(t,SIGNAL(timeout()),this,SLOT(showMsg()));
}
 
Widget::~Widget()
{
    delete ui;
    if(t!=NULL)
    {
        delete t;
        t=NULL;
    }
}
 
void Widget::showMsg()
{
    if(number<60)
        number++;
    if(number>=60)
        number=0;
    ui->label->setText(QString::number(number));
 
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
#include <QTime>
#include <QTimer>
 
 
namespace Ui {
class Widget;
}
 
class Widget : public QWidget
{
    Q_OBJECT
 
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
 
private slots:
    void showMsg();
 
private:
    Ui::Widget *ui;
    QTimer *t;
    int number=0;
};
 
#endif // WIDGET_H

18、秒-转换为时分秒

QString Myqcustomplot::formatTime(int s)
{
	if (s < 60)
		return "00:00:"+QString::number(s);
	
	long hor = s / 3600;
	long min = (s % 3600) / 60;
	long second = s % 3600 % 60;

	return QString::number(hor) + ":" + QString::number(min) + ":" + QString::number(second);
}

19、获取本机ip

QString getLocalIp()
{
	QString strIpAddress;
	QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
	// 获取第一个本主机的IPv4地址
	int nListSize = ipAddressesList.size();
	for (int i = 0; i < nListSize; ++i)
	{
		if (ipAddressesList.at(i) != QHostAddress::LocalHost &&
			ipAddressesList.at(i).toIPv4Address()) {
			strIpAddress = ipAddressesList.at(i).toString();
			break;
		}
	}
	// 如果没有找到,则以本地IP地址为IP
	if (strIpAddress.isEmpty())
		strIpAddress = QHostAddress(QHostAddress::LocalHost).toString();
	return strIpAddress;
}

20、编码转换

进行编码转换,避免显示乱码

QTextCodec *codec = QTextCodec::codecForName("GB2312");
#define TR(text) codec->toUnicode(text)

QT qcustomplot 实战经验分享之二:动态时间轴 准备工作 建立实时动态时间刷新曲线 定时器 时间轴设置 数据更新 定时器 建立定时器 //在头文件定义 #include "QTimer" QTimer * MainTimer; //在cpp文件中声明 MainTimer = new QTimer; 开启定时器 //启动定时器,1s MainTimer->start(1000); 建立定时器更新函数 // 绑定槽函数,即定时器更新函数,dataupdate为自己定义函数 connect(MainTimer,SIGNAL(tim 阅读详情

相关推荐

Qt开发实战:100条高效跨平台C++开发经验

Qt框架作为跨平台C++开发的核心工具,其信号槽机制和元对象系统(MOC)为GUI开发提供了独特优势。从基础原理看,Qt通过封装原生API实现了Windows/Linux/macOS等多平台适配,开发者只需编写一套代码即可部署到不同系统。在工程实践中,合理使用QTimer异步机制、QSS样式表优化以及模型/视图框架能显著提升应用性能,特别是在处理大数据量或复杂UI场景时。本文基于10年实战经验,总结了包括高DPI适配、内存管理、多线程编译等100条关键技巧,涵盖从开发环境配置到部署打包的全流程,帮助开发者规

weixin_30279315的博客 351

Qt之进程间通信(QProcess)

简述 QProcess可以在应用程序内部与其它进程通信,或启动其它应用程序。与在终端机之类的命令输入窗口上使用名称和参数是一样的,可以使用QProcess提供的函数start()启动进程。可以注册QStringList处理进程后的参数。 简述 命令行参数启动 说明 实现 命令行读取 说明 实现 更多参考 ...

weixin_33860528的博客 2863

QT qcustomplot 实战经验分享之四:曲线缩放、拖动

曲线拖动、缩放 主要为一个函数实现 ui->widget->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectLegend | QCP::iSelectPlottables); 说明 QCP::iRangeDrag:可以拖动 QCP::iRangeZoom:可以缩放 QCP::iSelectLegend: QCP::iSelectPlottables:图像可以选择 ...

weixin_43637946的博客 5431

QT QProcess 关闭程序 tasklist windows

QT程序,windows下指定程序名关闭程序,通过tasklist.exe int existProcess(QString proName) { if (!proName.endsWith(".exe")) proName.append(".exe"); QProcess process; process.start("tasklist.exe", QStringList() << "-fi" << QString("imagename.

qq_31075765的博客 1494

进度控件-Qt实现百分比进度

在主窗口中,我们连接这个信号到updateProgress(int value)槽函数,并在槽函数中更新进度控件的值。我们首先创建了一个QProgressBar控件,并在其基础上学习了如何更新进度值、实时更新进度值以及自定义进度控件的方法。具体来说,我们可以在主线程中创建一个新的线程,然后在这个线程中执行任务,并在任务执行的过程中不断发送信号更新进度值。在Qt中,我们可以使用setValue()函数更新进度控件的值。如果想要实时更新进度值,我们需要在一个线程中执行任务,并在任务执行的过程中不断更新进度值。

CodeGu的博客 756

升级至Qt 6的实战经验

在迁移过程中保持耐心和持续的测试,以确保您的应用程序在Qt 6下具有良好的性能和稳定性。使用Qt提供的工具和文档,逐一检查您的代码,并根据新的API规范进行修改。Qt 6提供了一些用于调试和解决问题的工具和技术,如Qt Creator中的调试器和分析器工具。利用这些工具,定位和解决潜在的问题,并确保您的应用程序在Qt 6下运行良好。在升级之前,确保您的应用程序的依赖项和第三方库是与Qt 6兼容的。请注意,以上提供的代码示例仅用于说明目的,实际迁移过程可能需要根据您的应用程序的具体情况进行调整。

James_CODER的博客 361

QT对QString字符串的操作百分比

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

zouniyade的博客 1769

小波变换(Wavelet Transform)原理及介绍

小波变换是一种多分辨率时频分析工具,克服了傅里叶变换无法定位时间信息的缺陷。通过可伸缩平移的母小波,它能同时捕捉信号的高频细节(短时特征)和低频轮廓(整体趋势)。其核心原理是利用不同尺度的小波基与信号进行内积运算,生成时频域系数矩阵。小波变换具有动态分辨率特性,高频部分时间精度高,低频部分频率分辨率好。主要应用包括瞬态事件检测、信号降噪、数据压缩(如JPEG2000)和压缩感知(如快速MRI)。

qq_42758052的博客 5482

Visual Studio 2015开发Qt项目实战经验分享

Visual Studio 2015开发Qt项目实战经验分享(附项目示例源码) 上面的作者博客内容写的不错 推荐大家看一看 避免走弯路

perfect-顾(coder)的博客 482

AUTO-DL平台快速部署BEVFormer:Nuscenes数据集完整训练避坑指南

本文详细介绍了在AUTO-DL平台高效部署BEVFormer模型并利用Nuscenes数据集进行完整训练的实战指南。重点解析了平台数据管理、环境配置、数据集迁移解压、预处理及训练启动等全流程中的关键步骤与常见避坑技巧,帮助研究者和工程师快速复现这一前沿视觉感知模型,节省云端训练时间与成本。

weixin_29188043的博客 330

汽车软件工程师必看:ASPICE流程实战指南(附完整产物清单)

本文为汽车软件工程师提供ASPICE流程实战指南,详细解析如何搭建合规开发环境、各阶段文档产出清单及工具链整合策略。通过实战案例和模板资源,帮助团队高效实施ASPICE标准,提升软件开发质量与效率。

weixin_29230805的博客 468

QT多线程实战经验

比如有一个blueToothWorker,继承了QThread,实现了run方法。那么该线程变量就是在函数栈上分配,一旦函数结束,线程没执行完,线程变量就被回收了。正确用法是堆上分配。并通过connect函数自动回收。

荒野 318

FPGA之道(22)VHDL基本程序框架

在介绍详细的VHDL语法之前,让我们先来了解一下VHDL代码的基本程序框架,这样可以让我们先对VHDL程序设计有一个整体的概念把握,进而在后续的VHDL语法学习中做到有的放矢。

Reborn Lee 8307

Qt实战经验

Qt工程文件(.pro)中最常用的变量 TEMPLATE:定义项目类型,如Applications,library等 CONFIG:指定编译器选项 HEADERS:头文件列表 SOURCES:源文件列表 QT:声明Qt模块,如core,GUI等 INCLUDEPATH:头文件搜索路径 LIBS:库文件搜索路径和库文件名称列表,-L包含库路径,-l包含库文件名字 设置TODO注释标签 ...

机器人们的后勤仓库 623

用FPGA驱动WS2812B点阵,手把手教你实现动态文字显示(附完整Verilog代码)

本文详细介绍了如何使用FPGA驱动WS2812B点阵实现动态文字显示,包括硬件连接、Verilog代码实现和动态效果设计。通过精确的时序控制和数据处理,读者可以掌握FPGA与WS2812B的交互技术,并实现炫酷的显示效果。附完整Verilog代码,适合硬件爱好者和工程师参考实践。

weixin_30482383的博客 669

c++实现异步线程池并详细分析线程池析构流程

多线程编程是提高程序性能和响应能力的关键技术之一,异步线程池作为多线程编程的一种有效实现方式,能够管理和复用线程资源,避免频繁创建和销毁线程带来的开销。在本文中,我们将深入探讨如何实现一个异步线程池。

2301_76564925的博客 1598

QT实战经验总结 连载中

当我练习简单的信号和槽的时候,只是 print 一些文字,所以我的槽函数没有封装到类中。我在练习信号和槽的时候发现,我的python代码(后端)可以给QML代码(前端)发现号,而前端也可以给后端发现号。所以我发现这两中发现号的方式是不一样的。作用是让 backend 这个类,可以在 QML 中调用,因为类定义是在 python 中写的。在这里,你需要在主窗口的类中初始化其他的窗口,然后你要创建一些打开、关闭窗口的函数。我在写后端逻辑时,会涉及到对前端 QML 控件的调用。前端给后端发,常用的比如点击按钮,

qq_15409121的博客 515

【MATLAB】通过计算曲率和曲率变化率来实现对曲线波浪程度

这段代码将计算给定曲线的曲率,并与给定阈值进行比较以检测拐角。函数是MATLAB中一个常用的函数,可以用于计算曲线在每个点处的曲率。它基于一种被称为“local least squares fitting” 的方法,通过拟合每个点周围的一小段曲线来计算曲率。MATLAB中可以使用多种方法实现拐角检测,其中一种方法是基于曲率半径的算法。该算法通过计算曲线上每个点处的曲率半径,找到拐角和弯曲处。是一个可选参数,用于控制拟合曲线的平滑度,取值范围为0到1,越接近1表示曲线越平滑。表示曲线在每个点处的曲率,

Fanjufei的博客 1918

QT qcustomplot 实战经验分享之六:曲线鼠标取值、十字浮标

常用功能,鼠标取值带十字浮标 取值 槽函数建立 主要用到了鼠标函数mouseMove connect(ui->widget,SIGNAL(mouseMove(QMouseEvent *)),this,SLOT(myMoveMouseEvent(QMouseEvent *))); 取值函数 void myMoveMouseEvent(QMouseEvent *e) { //获取坐标,窗体鼠标的位置,不是曲线x轴的值 int x_pos = e->pos().x(); /

weixin_43637946的博客 4329

家用扫地机器人研发技术路线-第四部分:如何一步步做出来 | 4阶段 · 从原型到量产

摘要:本文详细介绍了扫地机器人从原型到量产的研发流程,分为4个关键阶段。首先聚焦四大技术难点:SLAM定位、AI视觉识别、仿生机械臂和静音风机系统。研发过程包括实验室原型验证、工程样机测试、小批量真实场景测试和量产导入四个阶段,每个阶段设有严格评审标准。特别强调测试贯穿全程,包括模块单元测试、整机集成测试、长期可靠性测试和多样化场景模拟,确保产品在上市前完成数百次真实环境验证。整个流程体现了从技术攻关到产品落地的系统性工程思维。

智能硬件研发,欢迎交流 191

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

QT qcustomplot 实战经验分享之三:曲线样式设置

曲线样式 主要学习有哪些函数,并实际应用 设置整个窗体颜色为黑色 ui->widget->setBackground(QBrush("black")); 设置坐标名称颜色,比如x轴名称为 “时间”,时间为白色字体 ui->widget->xAxis->setLabelColor(QColor(Qt::white)); 设置坐标内容颜色,比如时间 08:01 显示为白色字体 ui->widget->xAxis->setTickLabelColor

weixin_43637946的博客 2145

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Qt实战经验总结

qt5.14+VS2022 项目引用

qq_40002966的博客 191

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Qt 串口类封装(基于QSerialPort )实战分享|附源码 + 使用经验

本文分享Qt 串口类封装(基于QSerialPort )实战经验,包含源码,各种使用小技巧

Jafi 的 blog 1646

Visual Studio 2015开发Qt项目实战经验分享(附项目示例源码)

        过去的几个月都在使用VS2015+QT5开发项目,一路走来,踩了很多坑,今天顺利完成项目的阶段性要求。为了让更多人少踩坑,特以系列博客将自己的经验记录下来,博客内容主要立足于解决除了编码之外会遇到的各种问题,如果是关于Qt中详细的语法等相关问题,本系列博客将不会提及。总之,希望对大家有帮助~项目的示例源码我也将上传到自己的GitHub账号,欢迎大家下载~项目源码地址按照项目进度排序...

罗先森何其有幸的博客 3万+

Qt线程开发避坑:QThread与QtConcurrent::run区别及实战经验教训

摘要: Qt多线程开发中,QThread与QtConcurrent::run的使用差异常被忽视。本文通过实际项目案例,对比两者在生命周期管理上的区别:QThread作为独立线程,与主线程绑定紧密,退出时自动终止;而QtConcurrent::run依赖线程池,主线程退出后可能残留未完成的子进程(表现为“虚假子进程”)。测试显示,直接关闭程序时,QThread实现无残留,而QtConcurrent::run会导致进程驻留。核心结论:长期任务应使用QThread手动管理生命周期,短期任务适合QtConcurre

weixin_43195076的博客 468

QT实战项目之WPS编辑器

在本QtWPS编辑器实战项目中,开发环境使用的是QT Create5.14版本。该项目实现了WPS编辑器的基础功能,例如打开文件、保存文件、打印文件预览、打印文件、复制、粘贴、剪切、撤销、重做、设置字体样式、调节字体大小、设置字体颜色等等。代码量在700左右,适合QT学者拿来学习,增加对QT文件等相关类的使用和增加项目开发经验。

Wumingdegushi的博客 1083
上一篇: Qt实现 自定义矩阵布局
下一篇: shell--实战小经验
Qt上位机开发
Qt上位机开发 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄9年 9664粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值