QT开发经验汇总
1.QT读写文件操作:
QTextStream文件流的方式来读写文件,速度快很多,基本上会有30%的提升,文件越大性能区别越大。
QFile file(":/test.txt");
if (file.open(QFile::ReadOnly)) {
//QTextStream方法读取速度至少快百分之30
#if 0
while(!file.atEnd()) {
QString line = file.readLine();
qDebug()<<line;
}
#else
QTextStream in(&file);
while (!in.atEnd()) {
QString line = in.readLine();
qDebug()<<line;
}
#endif
file.close();
}
2.QT工程中PRO文件的配置:
#禁用qdebug打印输出
DEFINES += QT_NO_DEBUG_OUTPUT
#自定义define变量 可以在整个项目中使用
#pro文件可以这样判断 contains(DEFINES, videovlc) {}
#代码文件可以这样判断 #ifdef videovlc
DEFINES += videovlc1 videoffmpeg
#关闭编译警告提示,编译时没有一堆红色的告警输出
CONFIG += warn_off
#指定编译生成的文件到temp目录 分门别类存储
MOC_DIR = temp/moc
RCC_DIR = temp/rcc
UI_DIR = temp/ui
OBJECTS_DIR = temp/obj
#指定编译生成的可执行文件到bin目录
DESTDIR = bin
3.QT中控件样式表(给一种样式)
// color:文本颜色 background-color:背景颜色
QLabel
{
color:red
background-color: rgb(92, 53, 102);
}
QLineEdit
{
background-color: rgb(238, 238, 236);
border: 3px solid #32435E;
border-radius: 5px;
color:green;
font-size:10;
}
QToolButton
{
background-color: rgb(46, 52, 54);
border-radius:10px;
color: rgb(245, 121, 0);
font-size:30;
}
QToolButton:pressed
{
color:red;
background-color: rgb(245, 121, 0);
border: 1px solid rgb(12 , 138 , 235);
padding-left:5px;
padding-top:5px;
}
QT中判断文件是否存在(不存在就创建并写内容,存在就读取内容)
QFileInfo fileInfo("/data/config.txt");
bool ret =false;
if(fileInfo.isFile()) // 文件存在
{
ret = true;
}
QFile file("/data/config.txt");
if(!file.open(QIODevice::ReadWrite|QIODevice::Text))
{
return;
}
QTextStream textin(&file);
if(ret)
{
qDebug()<<"file exste now read";
while (!textin.atEnd())
{
qDebug()<<textin.readLine();
}
}
else
{
qDebug()<<"file not exste now write";
textin<<"small"<<endl; // 写内容
}
file.close();
QT中操作json文件(主要用于读取修改配置)
class ctlJsonFile
{
public:
void readJsonFile();
};
void ctlJsonFile:: readJsonFile()
{
QFile loadFile("/data/config.json");
if(!loadFile.open(QIODevice::ReadWrite))
{
qDebug() << "could't open projects json";
return ;
}
QByteArray allData = loadFile.readAll();
loadFile.close();
QJsonParseError json_error;
QJsonDocument jsonDoc(QJsonDocument::fromJson(allData, &json_error));
if(json_error.error != QJsonParseError::NoError)
{
qDebug() << "json error!";
return ;
}
QJsonObject rootObj = jsonDoc.object();
QStringList keys = rootObj.keys();
for(int i = 0; i < keys.size(); i++)
{
qDebug() << "key" << i << " is:" << keys.at(i);
}
}
QT中操作sqlite
创建并打开数据库
QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");
database.setHostName("edison");
database.setDatabaseName("userInfo.db");
if(!database.isOpen())
{
qDebug()<<"open databaes;";
database.open();
}
创建表
// 创建名字为 user 的表,包含 account password ProduceTime(当前时间)
QSqlQuery query;
if(query.exec("create table user(account varchar primary key,password varchar,ProduceTime varchar)"))
{
qDebug()<<"create table successful";
}
else
{
QSqlError error = query.lastError();
qDebug()<<error.driverText()<<"database have exitsed...";
}
注册功能
typedef struct USER_INFOMATION
{
QString accunt;
QString password;
QString currentTime;
}USER_INFORMATION;
const QString userAccount = ui->resigerAccountLine->text();
const QString userPassword = ui->resigerPasswordLine->text();
const QString makesurepasswd = ui->makesurePasswordLine->text();
if(userAccount==""||userPassword==""||makesurepasswd=="")
{
m_msgBox->information(this,tr("提示"),tr("账号名或者密码不能为空!"));
return;
}
if(userPassword!=makesurepasswd)
{
m_msgBox->information(this,tr("提示"),tr("密码不一致,请重新输入!"));
return;
}
QSqlQuery query;
QString cmd = tr("select *from user where account = '%1';").arg(userAccount);
query.exec(cmd);
if(query.next())
{
qDebug()<<"账号已存在";
m_msgBox->information(this,tr("提示"),tr("账号已存在 0.0"));
ui->resigerAccountLine->clear();
ui->resigerPasswordLine->clear();
ui->makesurePasswordLine->clear();
return;
}
USER_INFORMATION tmpUser;
tmpUser.accunt = userAccount;
tmpUser.password = userPassword;
QDateTime currentime = QDateTime::currentDateTime();
tmpUser.currentTime = currentime.toString("yyyy-MM-dd hh:mm:ss");
QSqlQuery query;
query.prepare("insert into user values(:account,:password,:ProduceTime)");
query.bindValue(":account", tmpUser.accunt);
query.bindValue(":password", tmpUser.password);
query.bindValue(":ProduceTime",tmpUser.currentTime);
query.exec();
ui->stackedWidget->setCurrentWidget(ui->loginPage);
ui->accountLine->clear();
ui->passwordLine->clear();
登入功能
QString useraccount = ui->accountLine->text();
QString userpassword = ui->passwordLine->text();
if(useraccount==""||userpassword=="")
{
m_msgBox->information(this,tr("提示"),tr("账号名或者密码不能为空!"));
return;
}
QSqlQuery query;
QString cmd = QString("select account,password from user where account = '%1';").arg(useraccount);
query.exec(cmd);
while(query.next())
{
m_userName = query.value(0).toString();
m_userPasswd = query.value(1).toString();
m_currentTime = query.value(2).toString();
}
if(m_userPasswd == userpassword&&m_userName==useraccount)
{
ui->backbtn->setVisible(true);
ui->stackedWidget->setCurrentWidget(ui->showDataPage);
m_currentPage = MAIN_PAGE;
ui->backbtn->setVisible(true);
ui->stackedWidget->setCurrentWidget(ui->mainPage);
}
else
{
m_msgBox->information(this,tr("提示"),tr("账号或者密码错误!"));
return;
}
QT中计算字符串md5
QString md5Result(QString &data)
{
QCryptographicHash md5(QCryptographicHash::Md5);
//添加要计算的数据
md5.addData(data.toUtf8());
//获取md5结果
QByteArray md5Array = md5.result();
//最终转化为16进制字符串
QString md5data = md5Array.toHex().data();
return md5data;
}
或者
QString md5Result(QString &data)
{
QByteArray md5ret = QCryptographicHash::hash(data.toLatin1(), QCryptographicHash::Md5);
return QString(md5data);
}
产生13位时间戳
qDebug()<<"current time = "<<QString::number(QDateTime::currentMSecsSinceEpoch());