QT C++ 自学积累 『非技术文』
最近一段时间参与了一个 QT 项目的开发,使用的是 C++ 语法,很遗憾的是我之前从来没有接触过 C++ ,大学没有开过这堂课,也没用自己学习过,所有说上手贼慢,到现在为止其实也不是很清楚具体的开发技巧,毕竟是参与,东一复制西一粘贴的,就拉倒了。里面用到了很多东西,尽管很简单很简单,但是对于没有接触过的人来说还是很值得记录一下的,这篇博文只是自己学习记录,没啥营养,浅看则以,切勿尽信!对了,用的 QT5 哈,其他版本的不知道嗷!
QDebug 打印
在项目开发过程中难免遇到打印调试数据,打印数据很简单,引入 QDebug,然后就可以使用了:
cpp
#include <QDebug>
qDebug() << "hello, I'm + V";
看一下效果:
开启弹窗 Dialog
这玩意儿,首先得有弹窗文件,有弹窗文件就好说了,直接调用一下让他弹出来就行,比如做了一个叫做 GPUDialog 的弹窗:
cpp
#include "GPUDialog.h" // 引入弹窗文件
GPUDialog gpuDialog; // 实例化一个弹窗
gpuDialog.exec(); // 打开弹窗
写入配置文件
在QT里面嘞,有些配置数据可能需要写入配置文件,然后怎么写呢,用 QSetting:
cpp
#include <QSettings>
// 创建 QSettings
QSettings* setting = new QSettings("./config.ini", QSettings::IniFormat);
setting->setValue("ed/name", "+V"); // 写入配置
setting->setValue("ed/age", 18); // 写入配置
QString name = setting->value("ed/name").toString(); // 读取配置
QString age = setting->value("ed/age").toString(); // 读取配置
qDebug() << name << age;
看一下打印结果:
当然配置文件内容也可以看一下,是这个样子的:
弹出警示框
比如说,我们点击一个表单的提交按钮,如果没有输入表单数据,就需要提示用户清闲输入内容。
cpp
#include <QMessageBox>
QString warningTitle(tr("Data is empty"));
QMessageBox::warning(this, warningTitle,
tr("Please enter the data first and try again!"), QMessageBox::Ok);
弹出确认框
这个和上面的是差不多的,比如我们需要点击一个 "运行" 按钮,需要二次确认的时候,经常用到这种弹窗:
cpp
#include <QMessageBox>
QMessageBox::StandardButton response = QMessageBox::question(
nullptr, "Kill Exe Confirm", "Secondary Confirmation Dialogue Box Demonstration", QMessageBox::Yes | QMessageBox::No);
if (response == QMessageBox::Yes)
{
qDebug() << "Yes";
} else {
qDebug() << "No";
}
看一下效果:
然后看一下控制台打印的数据:
关闭第三方 exe 程序
比如说我们写一个程序,在程序需要执行的时候,需要关闭掉其他应用程序,就像是某些付费视频,配套专用的播放器,启动播放器的时候,他会把你电脑启动的截图、录屏插件全部强制杀死,就是一样的功能,不如下面案例,杀死 PixPin.exe 程序:
cpp
#include <QProcess>
QString progress = "taskkill /im PixPin.exe /f";
QProcess::execute(progress);
创建文件夹
创建文件夹就肯简单了,两行命令完成:
cpp
#include <QDir> // 引入库
QDir dir;
dir.mkpath("./wjw"); // 创建文件夹
看一下,在当前exe同级目录下就会出现我们创建的文件夹:
创建文件
创建文件和创建文件夹功能类似,但是代码有些区别:
cpp
#include <QDir> // 引入库
QDir dirPath("./");
QString filePathStr = dirPath.filePath("wjw.txt");
QFile file(filePathStr);
if (!file.open(QIODevice::WriteOnly)) { return; }
file.close();
嘿嘿,再看一下结果,这个文件出来啦 :
输入框输入格式校验
cpp
// 实现文本框只允许输入float类型
#include <QDoubleValidator>
QDoubleValidator* validator = new QDoubleValidator(this);
validator->setNotation(QDoubleValidator::StandardNotation);
this->ui->lineEdit->setValidator(validator);
// 实现文本框只允许输入int类型
#include <QIntValidator>
QIntValidator* validatorInt = new QIntValidator(this);
this->ui->lineEdit_2->setValidator(validatorInt);
获取网络日期
我们有的时候需要获取网络时间,这个时候就用下面的方法:
cpp
#include <QDateTime>
#include <QTcpSocket>
#include <QDate>
// 获取网络时间,如果没有获取到,则获取系统时间
QString Widget::getNetTime() {
QStringList urls;
urls << "time-b-g.nist.gov"
<< "time-c-g.nist.gov"
<< "time-d-g.nist.gov"
<< "time-e-g.nist.gov"
<< "time-a-wwv.nist.gov"
<< "time-b-wwv.nist.gov"
<< "time-c-wwv.nist.gov"
<< "time-d-wwv.nist.gov"
<< "time-e-wwv.nist.gov"
<< "time-a-b.nist.gov"
<< "time-b-b.nist.gov"
<< "time-c-b.nist.gov"
<< "time-d-b.nist.gov"
<< "time-e-b.nist.gov"
<< "time.nist.gov"
<< "utcnist.colorado.edu"
<< "utcnist2.colorado.edu";
bool isFind = false;
QString netTime = "";
QTcpSocket *socket = new QTcpSocket();
for (int i = 0; i < urls.size(); i++)
{
socket->connectToHost(urls.at(i), 13);
if (socket->waitForConnected())
{
if (socket->waitForReadyRead())
{
QString str(socket->readAll());
netTime = str.trimmed();
netTime = str.section(" ", 1, 2);
isFind = true;
break;
}
}
socket->close();
}
if(isFind)
{
QDateTime utcDateTime = QDateTime::fromString(netTime, "yy-MM-dd HH:mm:ss");
utcDateTime.setTimeSpec(Qt::UTC);
netTime = utcDateTime.toLocalTime().toString("yy-MM-dd");
} else {
QDateTime currentDateTime = QDateTime::currentDateTime();
netTime = currentDateTime.toString("yy-MM-dd");
}
delete socket;
return netTime;
}
获取 CPU 序列号
cpp
#include <QProcess>
#include <windows.h>
#include <QStringList>
// 获取CPU序列号
QString Widget::getCpuId()
{
QProcess p;
QString cmd = "wmic cpu get processorid";
p.start(cmd);
p.waitForFinished();
QString result = QString::fromLocal8Bit(p.readAllStandardOutput());
QStringList list = cmd.split(" ");
result = result.remove(list.last(), Qt::CaseInsensitive);
result = result.replace("\r", "");
result = result.replace("\n", "");
result = result.simplified();
return result ;
}
获取系统硬盘信息
cpp
#include <QProcess>
#include <windows.h>
#include <QStringList>
// 获取硬盘信息
QString Widget::getDiskID()
{
QProcess p;
QString cmd = "wmic diskdrive get model";
p.start(cmd);
p.waitForFinished();
QString result = QString::fromLocal8Bit(p.readAllStandardOutput());
QStringList list = cmd.split(" ");
result = result.remove(list.last(), Qt::CaseInsensitive);
result = result.replace("\r", "");
result = result.replace("\n", "");
result = result.simplified();
return result ;
}
获取 MAC 编码
cpp
#include <QNetworkInterface>
// 获取MAC编码
QString Widget::GetMacByNetworkInterface() {
QList<QNetworkInterface> NetList;//网卡链表
int NetCount = 0;//网卡个数
int Neti = 0;
QNetworkInterface thisNet;//所要使用的网卡
NetList = QNetworkInterface::allInterfaces();//获取所有网卡信息
NetCount = NetList.count();//统计网卡个数
for (Neti = 0; Neti < NetCount; Neti++) {//遍历所有网卡
if (NetList[Neti].isValid()) {//判断该网卡是否是合法
thisNet = NetList[Neti];//将该网卡置为当前网卡
break;
}
}
return thisNet.hardwareAddress().replace(":", "-"); //获取该网卡的MAC
}
暂时没有了~