1、release模式下打印log到指定文件,需在.pro文件添加如下代码:
DEFINES += QT_DEPRECATED_WARNINGS QT_MESSAGELOGCONTEXT
2、QWidget设置qss不生效,需重写paintEvent()事件
void TitleWidget::paintEvent(QPaintEvent *event)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
QWidget::paintEvent(event);
}
3、自定义类型注册
注意:继承子QObject的对象只能注册其指针类型
//头文件
#include <QMateType>
//类定义时进行声明
Q_DECLARE_METATYPE(MtInstall*);
//构造函数中注册
qRegisterMetaType<MtInstall*>("MtInstall*");
4、添加子工程 (.pri)
1. 在项目文件夹下建立新的文件夹Temp,并在文件夹中添加文本文档将后缀改为Temp.pri
2.在pri文件中添加代码:
INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD
3. 在工程文件中添加代码(pro):
INCLUDEPATH += $$PWD/include
include(Temp/Temp.pri)
4.保存即可
5、windows程序以管理员权限运行,.pro文件中添加:(msvc编辑器/mingw编辑器需要添加支持文件)
win32: QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\'\"
6、如果用了webengine模块,发布程序的时候带上QtWebEngineProcess.exe+translations文件夹+resources文件夹。
7、在开发时, 无论是出于维护的便捷性, 还是节省内存资源的考虑, 都应该有一个 qss 文件来存放所有的样式表, 而不应该将 setStyleSheet 写的到处都是。如果是初学阶段或者测试阶段可以直接UI上右键设置样式表,正式项目还是建议统一到一个qss样式表文件比较好,统一管理。
8、Qt最小化后恢复界面假死冻结,加上代码:
void showEvent(QShowEvent *e){
setAttribute(Qt::WA_Mapped);
QWidget::showEvent(e);
}
9、设置高分屏属性以便支持2K4K等高分辨率,尤其是手机app。
注意:必须写在main函数的QApplication a(argc, argv);的前面。
#if (QT_VERSION > QT_VERSION_CHECK(5,6,0))
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
10、巧妙的用QEventLoop开启事件循环,可以使得很多同步获取返回结果而不阻塞界面。QEventLoop内部新建了线程执行。
QEventLoop loop;
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
11、如果需要指定无边框窗体,但是又需要保留操作系统的边框特性,可以自由拉伸边框,可以使用
setWindowFlags(Qt::CustomizeWindowHint);
12、Qt中继承QWidget之后,样式表不起作用,解决办法有三个。强烈推荐方法一。
方法一:设置属性 this->setAttribute(Qt::WA_StyledBackground, true);
方法二:改成继承QFrame,因为QFrame自带paintEvent函数已做了实现,在使用样式表时会进行解析和绘制。
方法三:重新实现QWidget的paintEvent函数时,使用QStylePainter绘制。
void Widget::paintEvent(QPaintEvent *){
QStyleOption option;
option.initFrom(this);
QPainter painter(this);
style()->drawPrimitive(QStyle::PE_Widget, &option, &painter, this);
}
**13、 Qt打包发布,有很多办法,**Qt5以后提供了打包工具windeployqt(linux上为linuxdeployqt,mac上为macdeployqt)可以很方便的将应用程序打包,
**14、 安全的删除Qt的对象类,**强烈建议使用deleteLater而不是delete,因为deleteLater会选择在合适的时机进行释放,而delete会立即释放,很可能会出错崩溃。如果要批量删除对象集合,可以用qDeleteAll,比如 qDeleteAll(btns);
15、QWebEngineView控件由于使用了opengl,在某些电脑上可能由于opengl的驱动过低会导致花屏或者各种奇奇怪怪的问题,比如showfullscreen的情况下鼠标右键失效,需要在main函数启用软件opengl渲染。
#if (QT_VERSION > QT_VERSION_CHECK(5,4,0))
//下面两种方法都可以,Qt默认采用的是AA_UseDesktopOpenGL
QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);
//QCoreApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
#endif
QApplication a(argc, argv);
另外一个方法解决 全屏+QWebEngineView控件一起会产生右键菜单无法弹出的bug,需要上移一个像素
QRect rect = qApp->desktop()->geometry();
rect.setY(-1);
rect.setHeight(rect.height());
this->setGeometry(rect);
16、模态设置
很多时候用QDialog的时候会发现阻塞了消息,而有的时候我们希望是后台的一些消息继续运行不要终止,此时需要做个设置。
QDialog dialog;
dialog.setWindowModality(Qt::WindowModal);
17、巧用QMetaObject::invokeMethod
巧用QMetaObject::invokeMethod方法可以实现很多效果,包括同步和异步执行,比如有个应用场景是在回调中,需要异步调用一个public函数,如果直接调用的话会发现不成功,此时需要使用 QMetaObject::invokeMethod(obj, “fun”, Qt::QueuedConnection); 这种方式来就可以。invokeMethod函数有很多重载参数,可以传入返回值和执行方法的参数等。
18、qt信号和槽里面刷新控件立即生效的解决方法:
qApp->processEvents();
19、QWidget 直接设置样式不生效,qt帮助文档给出的解决如下:
.h文件
protected:
virtual void paintEvent(QPaintEvent *);
.cpp文件
void CFramelessWindow::paintEvent(QPaintEvent *)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
20、qt加载dll(已知.h和dll)
.h
extern "C" {
CHECKLABEL int IsLabelledFile(const char *filePath, unsigned char &Level, unsigned char &Status, char *uuid1 = NULL, char *uuid2 = NULL, char *uuid3 = NULL);
}
(方法一:QLibrary)
std::string szFilePath = "C:/Users/eetrust/Desktop/testSl/123.txt";
unsigned char secrecyLevel;
unsigned char secrecyStatus;
typedef int (*Function)(const char *, unsigned char&, unsigned char&, char *, char *,char *);
QLibrary library("checklabel.dll");
if (library.load()) //判断是否正确加载
{
Function function = (Function)library.resolve("IsLabelledFile");
if(function)
{
function(szFilePath.data(), secrecyLevel, secrecyStatus, NULL , NULL, NULL);
}
}
方法二:
.pro文件添加
INCLUDEPATH += $$PWD\ThridLib_CheckLabel
LIBS += -L$$PWD\ThridLib_CheckLabel\win -lchecklabel
调用cpp引入头文件后,直接调用:
std::string szFilePath = "C:/Users/eetrust/Desktop/testSl/123.txt";
unsigned char secrecyLevel;
unsigned char secrecyStatus;
if(0 == IsLabelledFile(szFilePath.data(), secrecyLevel, secrecyStatus, NULL , NULL, NULL))
{
qDebug() << "not serect label file.";
}
21、程序唯一实例启动(main共享内存限制)
// 唯一性检测
QSharedMemory sigleton(a.applicationName());
if(!sigleton.create(1))
{
CUIMessageBoxDlg *pMsgBox = new CUIMessageBoxDlg("程序已经运行,请先关闭!");
pMsgBox->setWindowModality(Qt::ApplicationModal); //设置界面不可点击
pMsgBox->show();
return -1;
}
22、QT在pro文件中添加宏定义变量
例如添加当前pro文件路径:
DEFINES += PRO_EXE=\“$$PWD\”
23、Qt保留小数点后两位
QString::number(mb,‘f’,2)
24、windows计算MD5
certutil -hashfile ******\Fiabel.dll MD5