Category Archives: 计算机编程语言

Programming Language

C++程序设计之QEventLoop实现进入和退出事件循环

QEventLoop类为我们提供了一种进入和退出事件循环的方法。在任何时候,你都可以创建一个QEventLoop实例,并通过调用exec()来启动一个事件循环。在循环期间,主动调用exit()可以使exec()强制返回。

void Worker::run()
{
    QEventLoop loop;
    QTimer *timer = new QTimer;
    connect(timer, &QTimer::timeout, this, [&]()
    {
        static int count = 0;
        qDebug() << QDateTime::currentDateTime().toString();
        if(++count == 10) loop.quit();
    },
    Qt::DirectConnection);
    timer->start(1000);
    loop.exec();
}

C++程序设计之Boost序列化与反序列化自定义数据结构

Boost Serialization的主要概念是归档。归档的文件是相当于序列化的C++对象的一个字节流。对象可以通过序列化添加到归档文件,反过来也可从归档文件中加载。

一、自定义数据结构

class DateTime
{
public:
    DateTime(int y=0, int m=0, int d=0)
    {year = y; month = m; day = d;}
    
    void Display(void)
    {cout << year << "-" << month << "-" << day << endl;}
    
    template<class Archive>
    friend void serialize(Archive &ar, DateTime &dt, const unsigned int version);
    
private:
    int year;
    int month;
    int day;
};

Continue reading

C++程序设计之Qt自定义数据类型的序列化与反序列化

一、自定义数据类型

class Data_Record
{
public:
    Data_Record(int id = 0, QString name = "", int age = 0, QString addr = "");
    void display();
    friend QDataStream &operator<<(QDataStream &stream, const Data_Record &data); // 序列化
    friend QDataStream &operator>>(QDataStream &stream, Data_Record &data);       // 反序列化

private:
    int ID;
    QString name;
    int age;
    QString addr;
};

Data_Record::Data_Record(int ID, QString name, int age, QString addr)
{
    this->ID = ID;
    this->name = name;
    this->age = age;
    this->addr = addr;
}

void Data_Record::display()
{
    qDebug() << ID << name << age << addr;
}

QDataStream &operator<<(QDataStream &stream, const Data_Record &data)
{
    stream << data.ID << data.name << data.age << data.addr;
    return stream;
}

QDataStream &operator>>(QDataStream &stream, Data_Record &data)
{
    stream >> data.ID >> data.name >> data.age >> data.addr;

    return stream;
}

Continue reading

C++程序设计之Qt基本数据类型的序列化与反序列化

一、Qt基本数据类型的序列化

    QFile file1("QText.dat");
    if(!file1.open(QIODevice::WriteOnly | QIODevice::Text)) return;
    QDataStream out(&file1);

    QString str1 = "中华人民共和国";
    int iData1 = 10000;
    double dData1 = 3.14;
    QVector<int> vec1 = {0,1,2,3,4,5,6,7,8,9};

    out << str1 << iData1 << dData1 << vec1;
    file1.close();

Continue reading

C++语言程序设计之正则表达式的简单示例

现在来说,支持C++11标准的C++语言均支持正则表达式。下面是简单的正则表达式示例,it定位到第一个位置,end_it是空迭代器,起到尾后迭代器的作用。同时,for循环中的it递增运算通过regex_search来推进迭代器,最终完成遍历任务。

#include <regex>
#include <iostream>

int main(void)
{
	std::string data = "<Person><Item><ID>100001</ID><NAME>CHN</NMAE><AGE>5500</AGE></Item>"
		"<Item><ID>100002</ID><NAME>USA</NMAE><AGE>300</AGE></Item></Person>";
	std::regex re("<Item><ID>(.*?)</ID><NAME>(.*?)</NMAE><AGE>(.*?)</AGE></Item>");

	for (std::sregex_iterator it(data.begin(), data.end(), re), end_it; it != end_it; it++)
	{
		std::cout << it->str(1) << "\t"
			<< it->str(2) << "\t"
			<< it->str(3) << std::endl;
	}

	return 0;
}

Qt程序设计之正则表达式的简单示例

正则表达式(Regular Expression)描述了一种字符串匹配的模式(Pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

#include <QRegularExpression>

int main(void)
{
    QString data = "<Person><Item><ID>100001</ID><NAME>CHN</NMAE><AGE>5500</AGE></Item>"
                   "<Item><ID>100002</ID><NAME>USA</NMAE><AGE>300</AGE></Item></Person>";
    QRegularExpression re("<Item><ID>(.*?)</ID><NAME>(.*?)</NMAE><AGE>(.*?)</AGE></Item>");

    QRegularExpressionMatchIterator it = re.globalMatch(data);
    while (it.hasNext())
    {
        QRegularExpressionMatch match = it.next();
        qDebug() << match.captured(1).toUtf8().data()
                 << match.captured(2).toUtf8().data()
                 << match.captured(3).toUtf8().data();
    }

    return 0;
}

Qt程序设计之Unicode编码字符串转中文问题

Qt程序设计之Unicode编码字符串转中文问题,就是要替换掉前面的“\\u”,再将4位16进制数转成QChar类型,问题基本解决。下面就用Qt自带的正则表达式解决,方法如下:

QString Unicode2CN(QString data)
{
    QRegularExpression re("\\\\u([0-9a-fA-F]{4})");
    QRegularExpressionMatchIterator it = re.globalMatch(data);

    while(it.hasNext())
    {
        QRegularExpressionMatch match = it.next();
        data.replace(match.captured(0), QChar(match.captured(1).toUShort(NULL, 16)));
    }

    return data;
}

Continue reading