阅读 231

Qt开发经验小技巧131-140

Qt开发经验小技巧131-140

Qt新版本往往会带来一些头文件的更新,比如以前使用QPainter绘制,不需要额外包含QPainterPath头文件,而5.15版本开始就需要显示主动引入#include "qpainterpath.h"才行。


Qt6.0发布了,是个比较大的改动版本,很多基础的类或者组件都放到单独的源码包中,需要自行官网下载并编译,默认不提供集成在开发目录下,需要手动编译并集成,比如QRegExp,QTextCodec类,需要编译集成后pro文件 QT += core5compat 才能用, 具体说明在https://doc.qt.io/qt-6/qtcore5-index.html。


qDebug输出打印信息,默认会完整打印转义字符,例如:\ " \t \n" 等,所以当你发现你明明设置了转义字符以后打印确还是转义前的字符,这就懵逼了,其实这是qdebug为了方便调试将各种字符都打印输出。无可否认,很多时候,我们极其兴奋的享受着Qt带来的各种轮子各种便利,但是偶尔,稍不留意,这些便利可能也会坑你一把。要做的就是擦亮眼睛,时刻谨慎,一步一个脚印踏踏实实码代码。


QString s1 = R"(\:device0)";

//TNND居然输出的是 \\:device0

qDebug() << s1;

//这次终于正确的输出 \:device0

qDebug().noquote() << s1;

1

2

3

4

5

很多人有疑问为何qss对浏览器控件中的网页样式没法控制,其实用屁股想想也知道,那玩意是html css去控制的,和Qt一毛钱关系也没有,根本管不着,如果想要对滚动条样式设置,可以在网页代码中设置样式就行。

<style type="text/css">

  ::-webkit-scrollbar{width:0.8em;}

  ::-webkit-scrollbar-track{background:rgb(241,241,241);}

  ::-webkit-scrollbar-thumb{background:rgb(188,188,188);}

</style>

1

2

3

4

5

Qt的ini配置文件默认不支持直接读写中文,需要手动设置下编码格式才行,强烈建议统一用utf-8编码,包括代码文件。

//设置了编码以后配置文件内容为 Company=上海物联网技术研究中心

//没有设置编码则配置文件内容为 Company=\xe4\xb8\x8a\xe6\xb5\xb7\xe7\x89\xa9\xe8\x81\x94\xe7\xbd\x91\xe6\x8a\x80\xe6\x9c\xaf\xe7\xa0\x94\xe7\xa9\xb6\xe4\xb8\xad\xe5\xbf\x83

void App::readConfig()

{

    QSettings set(App::ConfigFile, QSettings::IniFormat);

    set.setIniCodec("utf-8");


    set.beginGroup("AppConfig1");

    App::Company = set.value("Company", App::Company).toString();

    set.endGroup();

}

void App::writeConfig()

{

    QSettings set(App::ConfigFile, QSettings::IniFormat);

    set.setIniCodec("utf-8");


    set.beginGroup("AppConfig1");

    set.setValue("Company", App::Company);

    set.endGroup();

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

用Qt做安卓开发都会遇到权限的问题,早期的安卓版本可以直接通过 AndroidManifest.xml 配置文件来添加需要的权限,这样在安装app的时候就会提示该app需要哪些权限让用户同意,现在的安卓版本都改成了动态权限,需要在app运行的时候弹出提示让用户确认再有权限,Qt迎合了这种策略内置了动态申请权限的方法 QtAndroid::requestPermissionsSync。

//动态设置权限

bool checkPermission(const QString &permission)

{

#ifdef Q_OS_ANDROID

#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))

    QtAndroid::PermissionResult result = QtAndroid::checkPermission(permission);

    if (result == QtAndroid::PermissionResult::Denied) {

        QtAndroid::requestPermissionsSync(QStringList() << permission);

        result = QtAndroid::checkPermission(permission);

        if (result == QtAndroid::PermissionResult::Denied) {

            return false;

        }

    }

#endif

#endif

    return true;

}


int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

   

    //请求权限

    checkPermission("android.permission.READ_EXTERNAL_STORAGE");

    checkPermission("android.permission.WRITE_EXTERNAL_STORAGE");   


    return a.exec();

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

Qt重载qDebug输出自定义的信息。

struct FunctionInfo {

    QString function;

    QString name;

    QString groupEnabled;

    QString action;

    QString group;


    friend QDebug operator << (QDebug debug, const FunctionInfo &functionInfo) {

        QString info = QString("功能: %1  名称: %2  启用: %3  方法: %4  分组: %5")

                       .arg(functionInfo.function).arg(functionInfo.name).arg(functionInfo.groupEnabled)

                       .arg(functionInfo.action).arg(functionInfo.group);

        debug << info;

        return debug;

    }

};

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

对高分屏不同缩放比例的自适应处理方法。

//方法1:在main函数的最前面加上下面这句 5.6版本才开始有这个函数

#if (QT_VERSION > QT_VERSION_CHECK(5,6,0))

    QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

#endif


//方法2:在可执行文件同目录下新建文件 qt.conf 填入下面内容

[Platforms]

WindowsArguments = dpiawareness=0


//方法3:在main函数最前面设置Qt内部的环境变量

qputenv("QT_AUTO_SCREEN_SCALE_FACTOR", "1.5");


//方法4:新版本的Qt比如Qt5.14修正了对高分屏的处理支持不是整数的缩放

qputenv("QT_ENABLE_HIGHDPI_SCALING", "1");

QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

QTabWidget选项卡有个自动生成按钮切换选项卡的机制,有时候不想看到这个烦人的切换按钮,可以设置usesScrollButtons为假,其实QTabWidget的usesScrollButtons属性最终是应用到QTabWidget的QTabBar对象上,所以只要设置全局的QTabBar的这个属性关闭即可。为啥要设置全局的呢,因为如果只是对QTabWidget设置了该属性,而在QMainWindow窗体中QDockWidget合并自动形成的选项卡只有QTabBar对象导致依然是有切换按钮。

//对tabWidget设置无切换按钮

ui->tabWidget->setUsesScrollButtons(false);

//对tabBar设置无切换按钮

ui->tabWidget->tabBar()->setUsesScrollButtons(false);

//对整个系统的选项卡设置无切换按钮

QTabBar{qproperty-usesScrollButtons:false;}

//设置选项卡自动拉伸 这玩意居然之前自动计算来设置原来内置了哇咔咔

QTabBar{qproperty-expanding:false;}

//设置选项卡关闭按钮可见

QTabBar{qproperty-tabsClosable:true;}

//还有其他属性参见QTabBar头文件有惊喜

//依旧是万能大法所有可视化类的 Q_PROPERTY 包含的属性都可以这样设置

1

2

3

4

5

6

7

8

9

10

11

12

QMainWindow的分割线默认尺寸比较大,有时候想设置小一点或者不想要,最开始的时候以为是QSplitter,打印所有子元素找遍了也没找到影子,最后发现样式表中有对应设置的内容。

//真的是做梦也没想到要这样设置

QMainWindow::separator{width:1px;height:1px;margin:1px;padding:1px;background:#FF0000;}

1

2

Qt开发经验开源主页(持续更新):


https://gitee.com/feiyangqingyun/qtkaifajingyan

https://github.com/feiyangqingyun/qtkaifajingyan

————————————————

版权声明:本文为CSDN博主「feiyangqingyun」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/feiyangqingyun/article/details/115934580


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐