• 《QDebug 2022年9月》


    一、Qt Widgets 问题交流

    二、Qt Quick 问题交流

    1.ScrollView 关闭拖出边界时的回弹效果

    Flickable 提供了 boundsBehavior 和 boundsMovement 可以控制一些拖动 content 时的效果,比如可以拖出边界然后有回弹的一个效果。ScrollView 似乎没有导出相关的属性,不过目前它的实现其实内部就是一个 Flickable,所以可以通过对象树找到这个 Flickable 设置相关属性。

    1. ScrollView {
    2. id: sv
    3. anchors.fill: parent
    4. ScrollBar.vertical.policy: (ta.contentHeight + ta.padding * 2 < sv.height)
    5. ? ScrollBar.AlwaysOff
    6. : ScrollBar.AlwaysOn
    7. ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
    8. TextArea {
    9. id: ta
    10. width: parent.width
    11. height: sv.contentHeight
    12. }
    13. Component.onCompleted: {
    14. if(sv.children.length<1)
    15. return;
    16. let flick = sv.children[0]
    17. console.log(flick)
    18. //实际使用时可以用for找flick,此处演示省略
    19. if(typeof flick === typeof Flickable){
    20. flick.boundsBehavior = Flickable.StopAtBounds
    21. flick.boundsMovement = Flickable.StopAtBounds
    22. }
    23. }
    24. }

    2.ListView fetch more (惰性加载)的小问题 

    Qt 的 model 提供了 fetch more 相关接口,通过 canFetchMore 判断是否还有可加载的数据,然后在 fetchMore 接口中添加数据,调用一般发生在初始化以及滚动条拖动到底时。

    1. bool canFetchMore(const QModelIndex &parent) const override {
    2. if (parent.isValid())
    3. return false;
    4. return (curCount < allCount); //返回true表示还有数据可以加载
    5. }
    6. void fetchMore(const QModelIndex &parent) override {
    7. if (parent.isValid())
    8. return;
    9. int remainder = allCount - curCount;
    10. int itemsToFetch = qMin(20, remainder); //每次追加的个数
    11. if (itemsToFetch <= 0)
    12. return;
    13. beginInsertRows(QModelIndex(), curCount, curCount + itemsToFetch - 1);
    14. curCount += itemsToFetch; //插入到model
    15. endInsertRows();
    16. }

    (测试环境 Win10 + MSVC2019 + Qt5.15.2 64bit)

    当 canFetchMore 返回一次 false 或者 fetchMore 中没添加数据,再次下拉到底部就不触发 canFetchMore 了,但是拖动到头部却还能触发一次 canFetchMore。所以刷新不能只依赖 canFetchMore。调用 InsertRows 添加数据后 canFetchMore 下次又可用了,所以对于实时增加的数据,我们需要主动的刷新 model 使 canFetchMore 能正常触发。

    三、其他

    1.QMediaPlayer 播放 qrc 资源路径中的音频文件有时没有正常播放

    (测试环境 Win10 + MSVC2019 + Qt5.15.2 64bit)

    如果是绝对路径,播放基本正常,如果是 qrc 资源路径,播放时而正常时而直接结束了没播放。

    1. QMediaPlayer *player = new QMediaPlayer;
    2. player->setMedia(QUrl("qrc:/music.wav"));
    3. player->play();

    Qt 源码里有句注释:Qt 多媒体后端无法直接播放 qrc 文件,如果对应的平台后端支持 StreamPlayback,会将为该资源传递 QFile,否则将数据复制到一个临时文件并传递其路径。

    在调试时发现就是走的 QFile 直接读 qrc 而不是生成临时文件,但是可能内部逻辑有 BUG。最简单的解决方法:1,不把音视频放在 qrc,2,初始化时主动生成临时文件。

    2.DLL 动态库中提供的单例包含 QNetworkAccessManager 成员时,没法正常释放

    (测试环境 Win10 + MSVC2019 + Qt5.15.2 64bit)

    类似的BUG:https://bugreports.qt.io/browse/QTBUG-82984

    对于 DLL 中全局静态的 QNetworkAccessManager,delete 会被阻塞住,因为 static 生命周期比 main 函数中的 QApplication 长,所以此时 QApplication 已经被释放了。官方是不建议写 static QObject 对象的,但是有时有这方面的需求。

    简单的解决方法:main 退出前主动 delete QNetworkAccessManager。

    1. int main(int argc, char *argv[])
    2. {
    3. QApplication app(argc, argv);
    4. MainWindow w;
    5. w.show();
    6. int ret = app.exec();
    7. //在这里释放static QObject
    8. return ret;
    9. }

    3.Visual Studio 使用 editorconfig 设置创建的文件编码为 utf-8 

    VS 里创建的文件一般是根据 locale 来确定编码的,比如中文环境一般是 gb2312。VS 本身可以单个修改文件编码为 utf8,或者使用插件。目前版本的 VS 还支持 editorconfig 配置文件,相比插件更加灵活,且支持很多 IDE(Qt Creator 这个垃圾貌似还不支持,但是可以装对应的开源插件)。

    VS文档:EditorConfig settings - Visual Studio (Windows) | Microsoft Learn 

    官网:https://editorconfig.org/

    1. #https://editorconfig.org/
    2. root = true #所在目录是项目根目录,此目录及子目录下保存的文件都会生效
    3. [*] #所有文件
    4. indent_style = tab #缩进风格
    5. tab_width = 4 #缩进宽度
    6. charset = utf-8 #文件编码
    7. end_of_line = crlf #行尾格式,win一般为CRLF,linux一般为LF
    8. insert_final_newline = true #文件尾添加换行符,以防警告

     

    取消 【遵循项目编码约定】会关闭 Visual Studio 的 EditorConfig 支持。

     

  • 相关阅读:
    图神经网络 | Pytorch图神经网络ST-GNN
    uniapp实现我的订单页面无感 - 删除数据
    MySQL 主从复制与读写分离
    SSM的整合与使用
    【QT】QT事件Event大全
    2.6 Windows驱动开发:使用IO与DPC定时器
    基于DJYOS的SPI驱动编写指导手册
    基于SIFT图像特征识别的匹配方法比较与实现
    短视频如何展现效果更佳?不用类型的短视频有不同的侧重点
    aws-msk-托管kafka集群的简单使用(VPC内部访问:无验证和SASL认证)
  • 原文地址:https://blog.csdn.net/gongjianbo1992/article/details/127068604