QPrintDialog彈出慢的問題

開發環境

            操作系統: openkylin2qt版本  : 5.15.10

排查過程

????????首先看下問題的現象,

問題現象

????????

? ? ? 復現問題的demo很簡單,只能是從跟蹤qt代碼方面入手

            void MainWindow::on_pushButton_clicked(){QPrinter printer;QPrintDialog dialog(&printer,this);dialog.exec();}

????????現在需要找一個代碼的起點去跟蹤,想了半天沒有思緒,于是設置環境變量export QT_DEBUG_PLUGINS=1看看有沒有提示,結果發現程序會在這一行阻塞一段時間

     load library  "xxx/plugins/printsupport/libcupsprintersupport.so"

? ? ? ? 懷疑可能與加載libcupsprintersupport.so庫有關,可以從QLibrary加載插件庫的代碼開始查,經過gdb+打日志雙重定位下,找到了耗時的代碼范圍

            //這個函數在運行過程中被調用了多次QPrinterInfo QPrinterPrivate::findValidPrinter(const QPrinterInfo &printer){// Try find a valid printer to use, either the one given, the default or the first availableQPrinterInfo printerToUse = printer;if (printerToUse.isNull()) {printerToUse = QPrinterInfo::defaultPrinter(); //調用耗時1秒if (printerToUse.isNull()) {QStringList availablePrinterNames = QPrinterInfo::availablePrinterNames(); //調用耗時1秒if (!availablePrinterNames.isEmpty())printerToUse = QPrinterInfo::printerInfo(availablePrinterNames.at(0));}}return printerToUse;}//這個構造函數被調用了一次QUnixPrintWidgetPrivate::QUnixPrintWidgetPrivate(QUnixPrintWidget *p, QPrinter *prn): parent(p), propertiesDialog(nullptr), printer(prn),#if QT_CONFIG(cups)m_duplexPpdOption(nullptr),#endifoptionsPane(nullptr), filePrintersAdded(false){q = nullptr;if (parent)q = qobject_cast (parent->parent());widget.setupUi(parent);int currentPrinterIndex = 0;QPlatformPrinterSupport *ps = QPlatformPrinterSupportPlugin::get();if (ps) {const QStringList printers = ps->availablePrintDeviceIds(); //調用耗時1秒const QString defaultPrinter = ps->defaultPrintDeviceId();  //調用耗時1秒widget.printers->addItems(printers);const QString selectedPrinter = prn && !prn->printerName().isEmpty() ? prn->printerName() : defaultPrinter;const int idx = printers.indexOf(selectedPrinter);if (idx >= 0)currentPrinterIndex = idx;}widget.properties->setEnabled(true);#if QT_CONFIG(filesystemmodel) && QT_CONFIG(completer)QFileSystemModel *fsm = new QFileSystemModel(widget.filename);fsm->setRootPath(QDir::homePath());widget.filename->setCompleter(new QCompleter(fsm, widget.filename));#endif_q_printerChanged(currentPrinterIndex);QObject::connect(widget.printers, SIGNAL(currentIndexChanged(int)),parent, SLOT(_q_printerChanged(int)));QObject::connect(widget.fileBrowser, SIGNAL(clicked()), parent, SLOT(_q_btnBrowseClicked()));QObject::connect(widget.properties, SIGNAL(clicked()), parent, SLOT(_q_btnPropertiesClicked()));// disable features that QPrinter does not yet support.widget.preview->setVisible(false);}//上面調用耗時的函數就是下面這兩個QStringList QCupsPrinterSupport::availablePrintDeviceIds() const{QStringList list;cups_dest_t *dests;int count = cupsGetDests(&dests); //調用耗時1秒list.reserve(count);for (int i = 0; i < count; ++i) {QString printerId = QString::fromLocal8Bit(dests[i].name);if (dests[i].instance)printerId += QLatin1Char('/') + QString::fromLocal8Bit(dests[i].instance);list.append(printerId);}cupsFreeDests(count, dests);return list;}QString QCupsPrinterSupport::staticDefaultPrintDeviceId(){QString printerId;cups_dest_t *dests;int count = cupsGetDests(&dests); //調用耗時1秒for (int i = 0; i < count; ++i) {if (dests[i].is_default) {printerId = QString::fromLocal8Bit(dests[i].name);if (dests[i].instance) {printerId += QLatin1Char('/') + QString::fromLocal8Bit(dests[i].instance);break;}}}cupsFreeDests(count, dests);return printerId;}

???????????????cupsGetDests是cups庫的api

 (1) cups 是一個開放源代碼的打印系統,為Unix類操作系統(如Linux)提供了標準的打印架構。(2) libcupsprintersupport.so庫為qt開發者提供更便捷的api, libcupsprintersupport.so庫內部調用的還是cups庫api

????????????????

? ? ? ? ? ? ? ?我單獨寫了一個調用cups api的demo,進一步驗證是cupsGetDests耗時

            #include < cups/cups.h >#include < iostream >#include < ctime >#include < sys/time.h >//編譯命令 g++ test.cpp -lcups/*開始 cupsGetDestsTimestamp (milliseconds): 1742524701156Timestamp (milliseconds): 1742524702187結束 cupsGetDests開始 cupsFreeDestsTimestamp (milliseconds): 1742524702187Timestamp (milliseconds): 1742524702187結束 cupsFreeDests*/void getime(){struct timeval tv;gettimeofday(&tv, nullptr);long timestamp = tv.tv_sec * 1000 + tv.tv_usec / 1000;std::cout << "Timestamp (milliseconds): " << timestamp << std::endl;}int main() {// 獲取打印機列表cups_dest_t* dests = nullptr;std::cout << "開始 cupsGetDests" << std::endl;getime();int num_dests = cupsGetDests(&dests);  //此處耗時大約1秒getime();std::cout << "結束 cupsGetDests" << std::endl;/*if (num_dests == 0) {std::cerr << "No printers found!" << std::endl;return 1;}*/// 遍歷打印機列表for (int i = 0; i < num_dests; i++) {cups_dest_t& dest = dests[i];// 打印打印機名稱std::cout << "Printer Name: " << dest.name << std::endl;// 打印打印機是否默認if (dest.is_default) {std::cout << "  (Default Printer)" << std::endl;}// 打印打印機選項for (int j = 0; j < dest.num_options; j++) {std::cout << "  Option: " << dest.options[j].name<< " = " << dest.options[j].value << std::endl;}std::cout << std::endl;}// 釋放打印機列表std::cout << "開始 cupsFreeDests" << std::endl;getime();cupsFreeDests(num_dests, dests);getime();std::cout << "結束 cupsFreeDests" << std::endl;return 0;}

排查結論

????????qt程序運行過程中使用cups庫的api,調用api耗時,導致qt組件彈出慢

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74099.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74099.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74099.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VLAN:邏輯隔離沖突網絡的詳細講解

1. VLAN的基本概念 VLAN&#xff08;Virtual Local Area Network&#xff0c;虛擬局域網&#xff09; 是一種將物理網絡劃分為多個邏輯獨立網絡的技術。通過VLAN&#xff0c;不同邏輯網絡可以在同一物理網絡基礎設施上運行&#xff0c;彼此隔離&#xff0c;互不影響。 核心功能…

投影算子(Projection Operator)的定義、性質、分類以及應用

文章目錄 1. 投影算子的定義2. 投影算子的幾何意義3. 一些簡單的例子例 1&#xff1a;二維平面上的投影例 2&#xff1a;投影到一條任意方向的直線例 3&#xff1a;三維空間中投影到一個平面 4. 投影算子的性質4.1、冪等性&#xff08;Idempotency&#xff09;&#xff1a; P 2…

java使用Apache POI 操作word文檔

項目背景&#xff1a; 當我們對一些word文檔&#xff08;該文檔包含很多的標題比如 1.1 &#xff0c;1.2 &#xff0c; 1.2.1.1&#xff0c; 1.2.2.3&#xff09;當我們刪除其中一項或者幾項時&#xff0c;需要手動的對后續的進行補充。該功能主要是對標題進行自動的補充。 具…

接收與發送ipv6數據包

一、ipv6的概念 IPv6 是英文 “Internet Protocol Version 6”&#xff08;互聯網協議第 6 版&#xff09;的縮寫&#xff0c;是互聯網工程任務組&#xff08;IETF&#xff09;設計的用于替代 IPv4 的下一代 IP 協議&#xff0c;其地址數量號稱可以為全世界的每一粒沙子編上…

龍虎榜——20250321

今日A股龍虎榜方向分析 根據2025年3月21日龍虎榜數據&#xff08;漲停56家&#xff0c;跌停31家&#xff09;&#xff0c;市場呈現結構性分化行情&#xff0c;資金聚焦海洋經濟、機器人、鋰電等主線&#xff0c;部分個股遭機構大幅拋售。以下是具體方向解析&#xff1a; 一、資…

springboot milvus search向量相似度查詢 踩坑使用經驗

1.前提提要&#xff1a;java的pom 版本為&#xff1a;2.4.9 milvus 版本是&#xff1a;2.4.13-hotfix 2.先來工具類方法 /*** 向量搜索* param client* param query* return*/public SearchResp search(NonNull MilvusClientV2 client, NonNull VectorCondition query) {final …

[網絡安全] 濫用Azure內置Contributor角色橫向移動至Azure VM

本文來源于團隊的超輝老師&#xff0c;其系統分析了Azure RBAC角色模型及其在權限濫用場景下的攻擊路徑。通過利用AADInternals工具提升用戶至Contributor角色&#xff0c;攻擊者可在Azure VM中遠程執行命令&#xff0c;創建后門賬戶&#xff0c;實現橫向移動。文中詳述了攻擊步…

Android Compose 基礎布局之 Box 和 Stack 源碼深度剖析(九)

Android Compose 基礎布局之 Box 和 Stack 源碼深度剖析 一、引言 1.1 Android 開發中布局的重要性 在 Android 應用開發里&#xff0c;布局是構建用戶界面&#xff08;UI&#xff09;的關鍵環節。良好的布局設計能夠提升用戶體驗&#xff0c;使應用界面更加美觀、易用且具有…

知識蒸餾:讓大模型“瘦身“而不失智慧的魔術

引言&#xff1a;當AI模型需要"減肥" 在人工智能領域&#xff0c;一個有趣的悖論正在上演&#xff1a;大模型的參數規模每年以10倍速度增長&#xff0c;而移動設備的算力卻始終受限。GPT-4的1750億參數需要價值500萬美元的GPU集群運行&#xff0c;但現實中的智能設備…

多路FM調頻廣播解調器:多路電臺FM廣播信號一體化解調處理方案

多路FM調頻廣播解調器&#xff1a;多路電臺FM廣播信號一體化解調處理方案 支持OEM型號開放式協議支持二次開發設計 北京海特偉業科技有限公司任洪卓發布于2025年3月21日 在信息傳播領域&#xff0c;FM調頻廣播媒體以其獨特的優勢持續發揮著重要作用。為了應對日益增長的多路…

如何在Spring Boot中設置HttpOnly Cookie以增強安全性

引言 在Web開發中,Cookie是用于在客戶端和服務器之間傳遞信息的重要機制。然而,Cookie的安全性一直是一個備受關注的問題。特別是當Cookie中存儲了敏感信息(如會話ID)時,如何防止這些信息被惡意腳本竊取就顯得尤為重要。HttpOnly屬性是增強Cookie安全性的一種有效手段。本…

LangManus:新一代開源智能體框架如何讓AI開發更簡單?

你是否想過&#xff0c;代碼生成、數據分析甚至系統調試&#xff0c;都能由一個“AI助手”自動完成&#xff1f;最近&#xff0c;一款名為LangManus的開源項目在開發者社區掀起熱議。它不只是一個工具庫&#xff0c;更是一個能自主思考、執行復雜任務的智能體框架。無論是企業內…

【STM32】SPI通信協議W25Q64Flash存儲器芯片(學習筆記)

通信接口部分有介紹SPI&#xff1a;【STM32】USART串口協議&串口外設-學習筆記-CSDN博客 SPI通信協議 SPI通信 SPI&#xff08;Serial Peripheral Interface&#xff09;是由Motorola公司開發的一種通用數據總線四根通信線&#xff1a;SCK&#xff08;Serial Clock&…

批量合并 PPT 文件,支持合并成單個文件也支持按文件夾合并

合并多個 PPT 為一個 PPT 文檔是我們經常會碰到的需求&#xff0c;合并后不僅更容易管理&#xff0c;在某些場景&#xff08;比如批量打印&#xff09;下也非常的有用&#xff0c;那當我們需要批量合并多個 PPT 文檔地時候&#xff0c;我們有沒有比較高效的方法呢&#xff1f;今…

LDAP從入門到實戰:環境部署與配置指南(下)

#作者&#xff1a;朱雷 接上篇&#xff1a;《LDAP從入門到實戰&#xff1a;環境部署與配置指南&#xff08;上&#xff09;》 鏈接: link 文章目錄 2.5.添加賬號2.6.停止服務2.7.使用TLS證書2.7.1. TLS 證書2.7.2. TLS 配置2.7.3. 服務器配置 2.8.使用安全連接的反向代理 2.5…

發現一個好用的Vue.js內置組件

目錄 一、這個好用的內置組件是什么&#xff1f; 二、這個組件的主要功能 三、怎么使用&#xff1f; 四、使用注意事項 五、我的使用場景 一、這個好用的內置組件是什么&#xff1f; 今天在優化我的平臺應用時&#xff0c;發現一個好用的組件標簽--<keep-alive>。 …

dart學習記錄5(類、對象)

1.獲取運行時對象類型 使用Object 屬性的 runtimeType&#xff0c;它返回一個 Type 對象。 print(a 的類型是 ${a.runtimeType});??警告 在測試對象的類型時建議使用object is Type比測試 object.runtimeType Type 更穩定。 2.實例變量的聲明 class Point {double? x;…

啟明星辰春招面試題

《網安面試指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇網安資料庫https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…

Live555+Windows+MSys2 編譯Androidso庫和運行使用

下載 wget http://www.live555.com/liveMedia/public/live555-latest.tar.gz tar -xzvf live555-latest.tar.gz加入版本控制 git init git add . git commit -a -m "first init" git log修改config.android-arm64 cd live vim config.android-arm64 ./genMakefile…

實用工具-Stirling-PDF

windows桌面版參考這個文檔 Getting Started | Stirling-PDF 安裝包推薦使用迅雷下載&#xff0c;先轉存到迅雷網盤在使用迅雷下載速度嘎嘎快。 github:https://github.com/Stirling-Tools/Stirling-PDF Stirling-PDF 是一個強大的、基于 Web 的開源 PDF 處理工具&#xff0c…