|
12 | 12 | #include <QEvent> |
13 | 13 | #include <QFrame> |
14 | 14 | #include <QGridLayout> |
| 15 | +#include <QGuiApplication> |
15 | 16 | #include <QHBoxLayout> |
16 | 17 | #include <QLabel> |
17 | 18 | #include <QMessageBox> |
18 | 19 | #include <QMouseEvent> |
19 | 20 | #include <QProgressDialog> |
20 | 21 | #include <QPushButton> |
21 | 22 | #include <QResizeEvent> |
| 23 | +#include <QScreen> |
22 | 24 | #include <QScrollArea> |
23 | 25 | #include <QShowEvent> |
24 | 26 | #include <QStyle> |
@@ -463,10 +465,32 @@ QTTemplatePage::showTemplatePreview (const QString& templateId) { |
463 | 465 | QDialog* dialog= new QDialog (this); |
464 | 466 | dialog->setWindowTitle ( |
465 | 467 | qt_translate ("Template Preview - %1").arg (tmpl->name)); |
466 | | - dialog->setMinimumSize (DpiUtils::scaled (kPreviewDialogMinW), |
467 | | - DpiUtils::scaled (kPreviewDialogMinH)); |
468 | | - dialog->resize (DpiUtils::scaled (kPreviewDialogMinW), |
469 | | - DpiUtils::scaled (kPreviewDialogMinH)); |
| 468 | + |
| 469 | + // 根据屏幕可用区域限制对话框尺寸,防止高分屏下溢出 |
| 470 | + QScreen* screen= this->screen (); |
| 471 | + if (!screen) screen= QGuiApplication::primaryScreen (); |
| 472 | + QRect availGeo= screen ? screen->availableGeometry () : QRect (); |
| 473 | + int maxDlgH = availGeo.height () > 0 ? qRound (availGeo.height () * 0.9) |
| 474 | + : DpiUtils::scaled (kPreviewDialogMinH); |
| 475 | + |
| 476 | + // 预览区尺寸由对话框高度上限决定(1:1 正方形) |
| 477 | + int basePreviewSize= DpiUtils::scaled (PREVIEW_IMAGE_WIDTH); |
| 478 | + int maxPreviewSize = qRound (maxDlgH * 0.7); |
| 479 | + int previewSize = qMin (basePreviewSize, maxPreviewSize); |
| 480 | + |
| 481 | + // 对话框最大宽度收紧:仅比预览框宽一点(边距 + 少量余量) |
| 482 | + int marginW = DpiUtils::scaled (kPreviewLayoutMargin) * 2; |
| 483 | + int spacingW= DpiUtils::scaled (kPreviewLayoutSpacing); |
| 484 | + int maxDlgW = previewSize + marginW + spacingW; |
| 485 | + if (availGeo.width () > 0) { |
| 486 | + maxDlgW= qMin (maxDlgW, qRound (availGeo.width () * 0.9)); |
| 487 | + } |
| 488 | + |
| 489 | + int minW= qMin (DpiUtils::scaled (kPreviewDialogMinW), maxDlgW); |
| 490 | + int minH= qMin (DpiUtils::scaled (kPreviewDialogMinH), maxDlgH); |
| 491 | + dialog->setMinimumSize (minW, minH); |
| 492 | + dialog->setMaximumSize (maxDlgW, maxDlgH); |
| 493 | + dialog->resize (minW, minH); |
470 | 494 |
|
471 | 495 | QVBoxLayout* layout= new QVBoxLayout (dialog); |
472 | 496 | layout->setSpacing (DpiUtils::scaled (kPreviewLayoutSpacing)); |
@@ -502,9 +526,7 @@ QTTemplatePage::showTemplatePreview (const QString& templateId) { |
502 | 526 |
|
503 | 527 | // Preview area using reusable PDF preview widget |
504 | 528 | QTPdfPreviewWidget* previewWidget= new QTPdfPreviewWidget (dialog); |
505 | | - // 设置固定尺寸,确保无内容时也有足够显示区域 |
506 | | - previewWidget->setFixedSize (DpiUtils::scaled (PREVIEW_IMAGE_WIDTH), |
507 | | - DpiUtils::scaled (PREVIEW_IMAGE_WIDTH)); |
| 529 | + previewWidget->setFixedSize (previewSize, previewSize); |
508 | 530 |
|
509 | 531 | // Load PDF preview |
510 | 532 | if (!tmpl->previewUrl.isEmpty ()) { |
|
0 commit comments