Qt

Qt开发总结篇一

Posted by DEVIN on Sun, Jun 18, 2023

GUI界面

限制输入的内容

1QValidator *validator = new QIntValidator(100, 999, this);
2// 这样文本框只能输入100~999之间的数字
3ui->lineEdit->setValidator(validator);

显示格式控制

1ui->textEdit->setWordWrapMode(QTextOption::WrapAnywhere); // 任意地方换行
2ui->tableWidget->setTextElideMode(Qt::ElideMode); // 不显示省略号

Qt序列化

通过全局流操作运算符重载实现,可以序列化到文件等设备中,也可以序列化到QByteArray中。

 1// cmdinfo.h
 2// BaseInfo已经实现序列化
 3class CmdInfo : public BaseInfo {
 4public:
 5    friend QDataStream& operator>>(QDataStream&, CmdInfo&);
 6    friend QDataStream& operator<<(QDataStream&, const CmdInfo&);
 7
 8private:
 9    QString command_;
10    CmdType type_;
11};
12
13// cmdinfo.cpp
14QDataStream& operator>>(QDataStream &in, CmdInfo &data)
15{
16    BaseInfo &base = data;
17    qint32 tmpInt;
18
19    in >> base >> data.command_ >> tmpInt;
20    data.setType((CmdType)tmpInt);
21    return in;
22}
23QDataStream& operator<<(QDataStream &out, const CmdInfo &data)
24{
25    const BaseInfo &base = data;
26    out << base << data.command_ << (qint32)data.type_;
27    return out;
28}

序列化到文件中

 1// 读
 2QFile file("object.dat");
 3file.open(QFile::ReadOnly);
 4QDataStream in(&file);
 5in >> infoObj;
 6file.close();
 7
 8// 写
 9QFile file(datFilename(filename));
10file.open(QFile::Truncate | QFile::WriteOnly);
11QDataStream out(&file);
12out << infoObj;
13file.flush();
14file.close();

序列化到QByteArray中

1// The QBuffer class provides a QIODevice interface for a QByteArray.
2QByteArray byteArray;
3QBuffer buffer(&byteArray);
4buffer.open(QIODevice::WriteOnly);
5
6QDataStream out(&buffer);
7out << QApplication::palette();

QDateTime也重载了关于QDateTimeQDebug的全局流操作符

1class QDateTime {
2    friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QDateTime &);
3    friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QDateTime &);
4
5    friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QDateTime &);
6};

QByteArray的Copy-On-Write

QByteArray can be used to store both raw bytes (including ‘\0’s) and traditional 8-bit ‘\0’-terminated strings. Using QByteArray is much more convenient than using const char *. Behind the scenes, it always ensures that the data is followed by a ‘\0’ terminator, and uses implicit sharing (copy-on-write) to reduce memory usage and avoid needless copying of data.

 1#include <QByteArray>
 2#include <QDebug>
 3
 4int main()
 5{
 6    char buf[] = {'1', '2', 0, '3'};
 7    QByteArray ba1 = QByteArray::fromRawData(buf, 4);
 8    QByteArray ba2 = QByteArray(buf, 4); // 深拷贝
 9    qDebug() << ba2.size(); // 4
10    // buf的地址和ba1.constData()的地址相同
11    printf("buf=%p, ba1=%p, ba2=%p\n", buf, ba1.constData(), ba2.constData());
12
13    // 注意: data()接口会触发深拷贝,而constData不会触发深拷贝
14    ba1.data();
15    printf("buf=%p, ba1=%p, ba2=%p\n", buf, ba1.constData(), ba2.constData());
16    return 0;
17}
18
19// 输出:
20// 4
21// buf=0067fea4, ba1=0067fea4, ba2=012475d8
22// buf=0067fea4, ba1=0124b6f8, ba2=012475d8

底层原理

 1// qbytearray.h
 2
 3inline char *QByteArray::data()
 4{ detach(); return d->data(); }
 5
 6inline const char *QByteArray::data() const
 7{ return d->data(); }
 8
 9inline const char *QByteArray::constData() const
10{ return d->data(); }
11
12inline void QByteArray::detach()
13{ if (d->ref.isShared() || (d->offset != sizeof(QByteArrayData))) reallocData(uint(d->size) + 1u, d->detachFlags()); }