QT

QT编程贴士

QT编程接口的使用

Posted by Jannon on May 31, 2019

QFile接口类的使用

QFile类是QT中的文件操作接口类,可以实现对文件进行相应的读取和各种操作。例如文档中xml节点都在一行表示,没有回车和换行,不利于阅读,需要 对节点结束符后面添加换行符,优化文件显示结构。优化之前的文件内容如下:

<svg><g><circle><d="M 12,33"></circle></g></svg>

优化实现代码如下:

   QFile inFile("/home/Pictures/test.svg");
   QFile outFile("/home/Pictures/fix.svg");

   if(inFile.open(QFile::ReadOnly) && outFile.open(QFile::WriteOnly))
   {
       QTextStream in(&inFile),out(&outFile);
       QString fileStr = in.readAll();

       fileStr.replace(QString(">"),QString(">\n"));
       out<<fileStr;

       inFile.close();
       outFile.close();
   }

优化之后的文件如下:

<svg>
<g>
<circle>
<d="M 12,33">
</circle>
</g>
</svg>

也可以不使用输入输出流,直接使QFile接口实现:

QFile txtFile("/home/Pictures/test.txt");
QFile newTxtFile("/home/Pictures/new.txt");

if(txtFile.open(QFile::ReadWrite) && newTxtFile.open(QFile::WriteOnly))
{
    QByteArray fileData = txtFile.readAll();
    QString fileText(fileData);

    fileText.replace(QString(">"),QString(">\n"));
    newTxtFile.write(fileText.toUtf8());

    txtFile.close();
    newTxtFile.close();
}

修改替换文件内容:

QFile txtFile("/home/Pictures/test.txt");
   QFile newTxtFile("/home/Pictures/new.txt");
   if(txtFile.open(QFile::ReadWrite) && newTxtFile.open(QFile::WriteOnly))
   {
       QString fileText = txtFile.readAll();
       QRegularExpression rep("b");
       QString replacementText("a");

       QRegularExpressionMatchIterator it = rep.globalMatch(fileText);

       while(it.hasNext())
       {
           QRegularExpressionMatch match = it.next();
           fileText.replace(match.capturedStart(0), match.capturedLength(0), replacementText);
       }

       newTxtFile.write(fileText.toUtf8());
       txtFile.close();
       newTxtFile.close();
   }

test.txt中的文件内容:

hbppy
bpple

new.txt中的文件内容:

happy
apple

QByteArray接口类的使用

使用一个字节保存十进制或者十六进制整型数到QByteArray。代码实现如下:

    QByteArray arr;
    arr.append(28);
    arr.append(0x16);
    bool ok;
    // "\x1C\x16" Size: 2 element 7190 true    
    qDebug()<<arr<<"Size:"<<arr.size()<<"element"<<arr.toHex().toInt(&ok,16)<<ok;

    static const char va[] = {0x22,0x2f,0x08};
    QByteArray rawDataArray = QByteArray::fromRawData(va,sizeof (va));
    // 3 "222f08"
    qDebug()<<rawDataArray.size()<<rawDataArray.toHex();

    QByteArray ba;
    ba.resize(5);
    ba[0] = 0x3c;
    ba[1] = 0x04;
    ba[2] = 0x64;
    ba[3] = 0x18;
    ba[4] = 0x08;
    // < 5
    qDebug()<<ba[0]<<ba.size();

    QByteArray array;
    array.insert(0, 0x22);
    array.append(0x2d);
    array[2] = 0x01;
    array.insert(3, 0x05);
    QByteArray kk = array.left(1);
    int result = kk.toHex().toInt(nullptr,16);
    //34
    qDebug()<<result;
    QString mm(kk.toHex());
    //0
    qDebug()<<mm.compare("22");
    // "22" 4 "222d0105" 2
    qDebug()<<mm<<array.size()<<array.toHex()<<kk.toHex().size();

QT日志打印

同时打印日志到文件和控制台

void printLog(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    static QMutex mutex;

    mutex.lock();

    QString text;
    switch(type)
    {

    case QtDebugMsg:
        fprintf(stderr, "%s \n", msg.toLocal8Bit().constData());
        break;

    case QtWarningMsg:
        fprintf(stderr, "Warning:%s \n", msg.toLocal8Bit().constData());
        break;

    case QtCriticalMsg:
        fprintf(stderr, "Critical:%s \n", msg.toLocal8Bit().constData());
        break;

    case QtFatalMsg:
        fprintf(stderr, "Fatal:%s \n", msg.toLocal8Bit().constData());
    }

    switch(type)
    {

    case QtDebugMsg:
        text = QString("Debug:");
        break;

    case QtWarningMsg:
        text = QString("Warning:");
        break;

    case QtCriticalMsg:
        text = QString("Critical:");
        break;

    case QtFatalMsg:
        text = QString("Fatal:");
    }

    //QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);

    QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");

    QString current_date = QString("(%1)").arg(current_date_time);

    QString message = QString("%1 %2 %3").arg(text).arg(msg).arg(current_date);

    QString appDirString = QCoreApplication::applicationDirPath() + "/Logs";
    QDir d(appDirString);
    if(!d.exists())
        d.mkdir(appDirString);

    QString logFile = appDirString + "/log_1.txt";
    QString backFile = appDirString + "/log_0.txt";

    QFile file(logFile);

    file.open(QIODevice::WriteOnly | QIODevice::Append);

    if (file.size() >= 1 * 1024 * 1024) //文件达到1M后先备份再清空
    {
        QFile::remove(backFile);//删除原来的备份文件
        file.copy(backFile);    //拷贝文件至备份文件
        file.resize(0);             //清空文件内容
    }

    QTextStream text_stream(&file);

    text_stream << message << "\r\n";

    file.flush();

    file.close();

    mutex.unlock();

}

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