From 6c22fbaf0d8881274524506b744005021c482fd9 Mon Sep 17 00:00:00 2001 From: yeshanshan Date: Thu, 27 Aug 2026 11:27:19 +0800 Subject: [PATCH] style: refactor printer name retrieval to use cached list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Replace direct QPrinterInfo::availablePrinterNames() calls with a cached wrapper 2. Add printerNames and printerNamesInited members to DPrintPreviewDialogPrivate 3. Implement availablePrinterNames() to fetch printer names only once and cache them 4. Clear cached printer names when the dialog is finished to prevent stale data 5. Update isActualPrinter() to use the cached printer names list This change improves performance by avoiding repeated calls to QPrinterInfo::availablePrinterNames(), which can be expensive, especially when the printer list is large. The cache is properly invalidated when the dialog closes, ensuring fresh data on the next dialog opening. Influence: 1. Open the print preview dialog and verify the printer list loads correctly 2. Add or remove a printer while the dialog is open and verify the list does not refresh (expected behavior with caching) 3. Close the dialog and reopen it to verify printer list updates with new system printers 4. Test print-to-PDF and save-as-image options still appear correctly in the dropdown 5. Verify print job submission works correctly with cached printer names style: 重构打印机名称获取逻辑,使用缓存列表 1. 将直接的 QPrinterInfo::availablePrinterNames() 调用替换为带缓存的封装 方法 2. 在 DPrintPreviewDialogPrivate 中添加 printerNames 和 printerNamesInited 成员变量 3. 实现 availablePrinterNames() 方法,仅获取一次打印机名称并进行缓存 4. 对话框结束时清除缓存的打印机名称,防止数据过期 5. 更新 isActualPrinter() 方法以使用缓存的打印机名称列表 此更改通过避免重复调用 QPrinterInfo::availablePrinterNames() 来提升性 能,该调用在打印机列表较大时可能消耗较多资源。对话框关闭时会正确失效缓 存,确保下次打开时获取最新数据。 Influence: 1. 打开打印预览对话框,验证打印机列表能正确加载 2. 在对话框打开期间添加或删除打印机,验证列表不会刷新(缓存行为的预期 表现) 3. 关闭对话框后重新打开,验证打印机列表会随系统打印机变化而更新 4. 测试打印到 PDF 和另存为图片选项在下拉列表中仍然正常显示 5. 验证使用缓存的打印机名称提交打印任务能正常工作 PMS: BUG-375053 --- src/widgets/dprintpreviewdialog.cpp | 22 ++++++++++++++++++--- src/widgets/private/dprintpreviewdialog_p.h | 5 ++++- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/widgets/dprintpreviewdialog.cpp b/src/widgets/dprintpreviewdialog.cpp index 840bc60c4..c5db2e0b5 100644 --- a/src/widgets/dprintpreviewdialog.cpp +++ b/src/widgets/dprintpreviewdialog.cpp @@ -1017,7 +1017,7 @@ void DPrintPreviewDialogPrivate::initdata() { Q_Q(DPrintPreviewDialog); QStringList itemlist; - itemlist << QPrinterInfo::availablePrinterNames() + itemlist << availablePrinterNames() << qApp->translate("DPrintPreviewDialogPrivate", "Print to PDF") << qApp->translate("DPrintPreviewDialogPrivate", "Save as Image"); printDeviceCombo->addItems(itemlist); @@ -1293,6 +1293,12 @@ void DPrintPreviewDialogPrivate::initconnections() QObject::connect(copycountspinbox->lineEdit(), SIGNAL(textEdited(const QString &)), q, SLOT(_q_spinboxValueEmptyChecked(const QString &))); QObject::connect(scaleRateEdit->lineEdit(), SIGNAL(textEdited(const QString &)), q, SLOT(_q_spinboxValueEmptyChecked(const QString &))); QObject::connect(inclinatBox->lineEdit(), SIGNAL(textEdited(const QString &)), q, SLOT(_q_spinboxValueEmptyChecked(const QString &))); + + QObject::connect(q, &DPrintPreviewDialog::finished, q, [this]() { + qDebug(dPrintPreview) << "DPrintPreviewDialog finished, clear printerNames"; + printerNames.clear(); + printerNamesInited = false; + }); } void DPrintPreviewDialogPrivate::setfrmaeback(DFrame *frame) @@ -2249,10 +2255,20 @@ void DPrintPreviewDialogPrivate::matchFitablePageSize() } } +QStringList DPrintPreviewDialogPrivate::availablePrinterNames() +{ + if (!printerNamesInited) { + qDebug(dPrintPreview) << "Get printer names from QPrinterInfo."; + printerNamesInited = true; + printerNames = QPrinterInfo::availablePrinterNames(); + qDebug(dPrintPreview) << "Available printer names:" << printerNames; + } + return printerNames; +} + bool DPrintPreviewDialogPrivate::isActualPrinter(const QString &name) { - const QStringList &printerNames = QPrinterInfo::availablePrinterNames(); - return printerNames.contains(name); + return availablePrinterNames().contains(name); } QString DPrintPreviewDialogPrivate::getColorModeConfig(const QString &printer) diff --git a/src/widgets/private/dprintpreviewdialog_p.h b/src/widgets/private/dprintpreviewdialog_p.h index 834b47a3b..f39796293 100644 --- a/src/widgets/private/dprintpreviewdialog_p.h +++ b/src/widgets/private/dprintpreviewdialog_p.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2019 - 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2019 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later @@ -92,6 +92,7 @@ class DPrintPreviewDialogPrivate : public DDialogPrivate void setPageLayoutEnable(const bool &checked); void matchFitablePageSize(); bool isActualPrinter(const QString &name); + QStringList availablePrinterNames(); QString getColorModeConfig(const QString &printer); void saveColorModeConfig(const QString &printer, const QString &colorMode); @@ -189,6 +190,8 @@ class DPrintPreviewDialogPrivate : public DDialogPrivate DSpinBox *opaBox = nullptr; QVector marginOldValue; // 记录margin自定义时的旧值 如果旧值和新值一致,就不需要刷新,top left right bottom QList minnumMargins; + QStringList printerNames; + bool printerNamesInited = false; QSpacerItem *spacer = nullptr; QSpacerItem *wmSpacer = nullptr; DFloatingWidget *colorWidget = nullptr;