qt开发问题记录 持续更新

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值