Qt 笔记

中文乱码解决方案

// 在文件最前面加下面代码
#pragma execution_character_set("utf-8") // 编译时把程序里的字符串使用 UTF-8 进行处理

// 在 main 函数加这个
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));   // 使用 UTF-8 的运行时环境

执行文件所在绝对目录

QApplication::applicationDirPath()

QTableView的一些用法

setSelectionBehavior(QAbstractItemView::SelectRows); // 行选择
setSelectionMode(QAbstractItemView::SingleSelection); // 单选
setSelectionMode(QAbstractItemView::ExtendedSelection); // 多选(Ctrl、Shift、Ctrl+A都可以)
horizontalHeader()->setStyleSheet("QHeaderView::section{background-color:rgb(225,225,225)};"); // 列头灰色
horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); // 列宽自适应
horizontalHeader()->setHighlightSections(false); // 取消表头选择高亮
hideColumn(0); // 隐藏第0列 比如id
setModel(model); // 设置model
selectRow(row); // 选择第row行
setFocus(); // 设置为焦点

error C2338: No Q_OBJECT in the class with the signal

该类没加 Q_OBJECT

Qt自带简单加密

QByteArray byte_array="password";
// QCryptographicHash 不可逆
QByteArray md4_byte_array=QCryptographicHash::hash(byte_array,QCryptographicHash::Md4).toHex();
QByteArray md5_byte_array=QCryptographicHash::hash(byte_array,QCryptographicHash::Md5).toHex();
QByteArray sha1_byte_array=QCryptographicHash::hash(byte_array,QCryptographicHash::Sha1).toHex();
QByteArray sha256_byte_array=QCryptographicHash::hash(byte_array,QCryptographicHash::Sha256).toHex();
QByteArray sha512_byte_array=QCryptographicHash::hash(byte_array,QCryptographicHash::Sha512).toHex();
QByteArray sha3_256_byte_array=QCryptographicHash::hash(byte_array,QCryptographicHash::Sha3_256).toHex();
QByteArray sha3_512_byte_array=QCryptographicHash::hash(byte_array,QCryptographicHash::Sha3_512).toHex();
// Base64
QByteArray base64_byte_array=byte_array.toBase64(); // 加密
QByteArray decrypt_base64 QByteArray::fromBase64(base64_byte_array); // 解密

QMap可以这样初始化

// 使用 QMap(std::initializer_list<std::pair<Key, T> > list) 构造函数
QMap<int,QString> map({{1,"One"},{2,"Two"}});

QList遍历

QList<int> list;
for(const auto &i : list){ // 只读
    // i
}
for(auto &i : list){ // 读写
    // i
}
for(auto i=list.cbegin(); i!=list.cend(); ++i){ // 只读
    // *i
    // i.value()
}
for(auto i=list.begin(); i!=list.end(); ++i){ // 读写
    // *i
    // i.value()
}

QMap遍历

QMap<QString,QVariant> map;
for(auto i=map.cbegin(); i!=map.cend(); ++i){ // 只读
    // i.key()
    // i.value()
}
for(auto i=map.begin(); i!=map.end(); ++i){ // 读写
    // i.key()
    // i.value()
}

信号转发

// QObject::connect(a, &A::Signal, b, [=](const QString &t) { b->Signal(t); });
// 2019-12-25 15:32:44 更新 可以直接转发 上面的 废除
QObject::connect(a, &A::Signal, b, &B::Signal);

获取屏幕分辨率

QGuiApplication::screens().at(0)->size();

Qt最适合XP系统开发的版本

5.6.2

Qt文件路径处理

QString path_file = QStringLiteral("C:/test/test.txt");
QString file_path, file_name, base_name, file_suffix;
QFileInfo file_info = QFileInfo(path_file);
file_path = file_info.absolutePath(); // "C:/test" 文件路径
file_name = file_info.fileName(); // "test.txt" 完整文件名
base_name = file_info.baseName(); // "test" 文件名称
file_suffix = file_info.suffix(); // "txt" 后缀名

Qt字符串转16进制

QString str = "10 06"; // 字符串
QByteArray hex = QByteArray::fromHex(str.toLatin1()); // \x10\x06

Qt16进制转字符串

QByteArray hex = QByteArray::fromRawData("\x10\x06", 2);
QString str = temp.toHex(' ').toUpper(); // 10 06

QButton系列 菜单栏的实现

// 创建菜单
__menu = new QMenu(this);
__action = new QAction("test", this);
__menu->addAction(__action);

// 添加到按钮
__ui->button->setMenu(__menu);
__ui->button->setStyleSheet("QPushButton::menu-indicator{image:none;}"); //不显示下拉图片 太丑了~
// __ui->button->setStyleSheet("QToolButton::menu-indicator{image:none;}");

// 实现按键点击事件
on_button_clicked() { // QPushButton 不需要主动显示菜单 且 不会进槽函数
    __ui->button->showMenu();   // 这里QToolButton需要主动显示菜单
}

QTable系列 滚动到最前最后

scrollToTop(); // 滚动到最前
scrollToBottom(); // 滚动到最后

UUID

QString uuid = QUuid.createUuid().toString().replace(QExp("[\\{\\}-]")."").toUpper();

QString判断是否包含中文

bool b = str.contains(QRegExp("[\\x4E00-\\x9FA5]+")); // 中文的 区间在 [0x4e00,0x9fa5]

获取全部可用串口并排序

QStringList portNames;
auto portInfos = QSerialPortInfo::availablePorts(); // 获取全部串口
for (const auto &portInfo : portInfos) {   // 查找可用的串口
    if (portInfo.isValid() && !portInfo.isBusy()) {   // 串口有效 且 串口空闲 2020-3-23 11:47:42 添加有效性检测
        portNames.append(portInfo.portName());
    }
}
qSort(portNames.begin(), portNames.end(), [](const QString &a, const QString &b) {  // 自定义 按照 COM后面的数字大小排序
    return a.mid(3, a.size() - 3).toInt() < b.mid(3, b.size() - 3).toInt();
}); // COMx 按x数字大小排序

在预编译期间高效载入QSS文件

// main.cpp
const char *qss = { #include "ui.qss" };
int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    a.setStyleSheet(qss);

    // ...

    return a.exec();
}

设置窗口只保留关闭按钮 且 固定大小

setWindowFlags(Qt::WindowCloseButtonHint | Qt::MSWindowsFixedSizeDialogHint);

设置窗口为子窗口模式

setWindowModality(Qt::ApplicationModal);    //

QString正则匹配

QString name("test.db");
QRegExp("^[A-Za-z]{1}[A-Za-z0-9]{2,19}\.db$").exactMatch(name); //

Qt生成随机数

double generateDouble();    // 生成一个0-1的随机浮点数
double bounded(double highest); // 生成一个0-highest的随机浮点数
quint32 bounded(quint32 highest);
int bounded(int highest);   // 生成一个0-highest的随机整
quint32 bounded(quint32 lowest, quint32 highest);
int bounded(int lowest, int highest);

QRandomGenerator::global()->bounded(10);        // 生成一个0和10之间的整数
QRandomGenerator::global()->bounded(10.0F); // 生成一个0和10.123之间的浮点数
QRandomGenerator::global()->bounded(10, 15);    // 生成一个10和15之间的整数

QMenu 插入 QAction 到 QMenu 前

QMenu *menuMain0 = QMenu("主菜单0");
QAction *actionMain0 = QAction("子菜单0");
menuBar->addAction(menuMain0->menuAction());
menuMain0->addAction(actionMain0);
// 以上是 ui 自动编译
// 代码里面这样插入
QAction *newAction = new QAction("主菜单1");   // 直接在 menuBar 的 QAction
ui->menuBar->insertAction(ui.menuMain0->menuAction(), newAction);   // 插入

QDir 创建多级子目录

bool QDir::mkpath(const QString &dirPath) const;

将软件当前目录设置为 exe所在目录

QDir::setCurrent(QCoreApplication::applicationDirPath());   // 设置当前目录为 exe所在目录

判断QObject类型

bool QObject::inherits(const char *className) const;
QObject* obj = new QDoubleSpinBox();
obj->inherits("QDoubleSpinBox");    // true
obj->inherits("QAbstractSpinBox");  // true
obj->inherits("QObject");   // true
obj->inherits("QSpinBox");  // false

判断窗口处于哪个屏幕

qApp->screens().indexOf(qApp->screenAt(QPoint(this->x(), this->y())));

本文作者:vanxkr

本文链接:http://www.vanxkr.com/2050/1/Qt-note

版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0许可协议。转载请注明出处!

0 条评论
已登录,注销 取消