中文乱码解决方案
// 在文件最前面加下面代码
#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())));