DialogLimitEdit.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #include "DialogLimitEdit.h"
  2. #include "ui_DialogLimitEdit.h"
  3. #include <QScreen>
  4. #include <QTimer>
  5. #include <QWindow>
  6. #include <QDebug>
  7. #include <QIntValidator>
  8. #include <QPropertyAnimation>
  9. #include "LanguageManager.h"
  10. #include "GeneralInterface.h"
  11. DialogLimitEdit::DialogLimitEdit(QWidget *parent)
  12. : QDialog(parent)
  13. , ui(new Ui::DialogLimitEdit)
  14. {
  15. ui->setupUi(this);
  16. initWidget();
  17. setBackground();
  18. setWindowModality(Qt::WindowModal);
  19. setAttribute(Qt::WA_TranslucentBackground);
  20. setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
  21. initConnect();
  22. }
  23. DialogLimitEdit::~DialogLimitEdit()
  24. {
  25. delete ui;
  26. }
  27. Limit DialogLimitEdit::limit_info()
  28. {
  29. updateData();
  30. return m_limit_info;
  31. }
  32. void DialogLimitEdit::setLimit_info(const Limit &newLimit_info)
  33. {
  34. m_limit_info = newLimit_info;
  35. }
  36. void DialogLimitEdit::clear()
  37. {
  38. m_limit_info.startPeriod = 0;
  39. m_limit_info.limit = 0;
  40. }
  41. void DialogLimitEdit::initWidget()
  42. {
  43. QStringList unitList;
  44. unitList << ChargingProfiles::UnitType::AMPERE;
  45. unitList << ChargingProfiles::UnitType::WATT;
  46. ui->chargingRateUnit->addItems(unitList);
  47. QStringList durationUnitList;
  48. durationUnitList << "HH:mm:ss"
  49. << "S";
  50. ui->startPeriodUnit->addItems(durationUnitList);
  51. ui->limit->setEditType(EditType::DOUBLE);
  52. }
  53. void DialogLimitEdit::initConnect()
  54. {
  55. connect(ui->chargingRateUnit, &CustomComboBox::currentIndexChanged, this, [this](const int& index) {
  56. switch (index) {
  57. case ChargingProfiles::UnitType::AMPERE_ID:
  58. ui->unit->setText(tr("A"));
  59. break;
  60. case ChargingProfiles::UnitType::WATT_ID:
  61. ui->unit->setText(tr("KW"));
  62. break;
  63. default:
  64. break;
  65. }
  66. });
  67. connect(ui->cancel, &QPushButton::clicked, this, [this]() {
  68. reject();
  69. });
  70. connect(ui->ok, &QPushButton::clicked, this, [this](){
  71. accept();
  72. });
  73. connect(ui->startPeriodUnit, &CustomComboBox::currentIndexChanged, this, [this]() {
  74. setDuration();
  75. });
  76. connect(LanguageManager::instance(), &LanguageManager::languageChanged, this, [this]() { ui->retranslateUi(this); });
  77. }
  78. void DialogLimitEdit::setBackground()
  79. {
  80. m_background = new QLabel();
  81. ui->background_layout->addWidget(m_background, 0, 0, ui->background_layout->rowCount(), ui->background_layout->columnCount());
  82. m_background->setPixmap(QPixmap(":/images/price/dialog_edit_background.png"));
  83. m_background->lower();
  84. m_background->setScaledContents(true);
  85. }
  86. void DialogLimitEdit::centerWindow()
  87. {
  88. // 确保窗口尺寸已确定(关键修复)
  89. this->ensurePolished();
  90. // this->adjustSize();
  91. // 获取有效的屏幕几何尺寸(考虑多显示器)
  92. QScreen *screen = QGuiApplication::primaryScreen();
  93. if (QWindow *window = this->windowHandle()) {
  94. screen = window->screen();
  95. }
  96. QRect screenGeometry = screen->availableGeometry();
  97. // 计算居中位置(考虑Wayland特性)
  98. int x = (screenGeometry.width() - this->width()) / 2 + screenGeometry.x();
  99. int y = (screenGeometry.height() - this->height()) / 2 + screenGeometry.y();
  100. if (QGuiApplication::platformName().contains("wayland")) {
  101. // Wayland专用处理
  102. if (QWindow *window = this->windowHandle()) {
  103. // 重要:延迟设置位置,确保Wayland合成器已准备好
  104. QTimer::singleShot(100, this, [window, x, y]() {
  105. window->setPosition(QPoint(x, y));
  106. // 替代requestActivate的方案
  107. window->setFlags(window->flags() | Qt::WindowStaysOnTopHint);
  108. QTimer::singleShot(50, [window]() {
  109. window->setFlags(window->flags() & ~Qt::WindowStaysOnTopHint);
  110. });
  111. });
  112. }
  113. } else {
  114. // 传统X11处理
  115. this->move(x, y);
  116. }
  117. }
  118. void DialogLimitEdit::refreshData()
  119. {
  120. setDuration();
  121. ui->chargingRateUnit->setCurrentText(m_limit_info.unit);
  122. ui->limit->setText(QString::number(m_limit_info.limit / 1000.0, 'f', 2));
  123. }
  124. void DialogLimitEdit::setDuration()
  125. {
  126. switch (ui->startPeriodUnit->currentIndex()) {
  127. case StartPeriodUnit::UTC_STR:
  128. ui->startPeriod->setText(GeneralInterface::getCurrentDate(m_limit_info.startPeriod));
  129. ui->startPeriod->setEditType(EditType::TEXT);
  130. break;
  131. case StartPeriodUnit::SECONDS:
  132. ui->startPeriod->setText(QString::number(m_limit_info.startPeriod));
  133. ui->startPeriod->setEditType(EditType::INT);
  134. break;
  135. default:
  136. break;
  137. }
  138. }
  139. void DialogLimitEdit::updateData()
  140. {
  141. m_limit_info.startPeriod = getDuration();
  142. m_limit_info.unit = ui->chargingRateUnit->currentText();
  143. m_limit_info.limit = ui->limit->text().toDouble() * 1000;
  144. }
  145. int DialogLimitEdit::getDuration()
  146. {
  147. switch (ui->startPeriodUnit->currentIndex()) {
  148. case StartPeriodUnit::UTC_STR: return GeneralInterface::getCurrentDate(ui->startPeriod->text());
  149. case StartPeriodUnit::SECONDS: return ui->startPeriod->text().toDouble();
  150. default:
  151. break;
  152. }
  153. return 0;
  154. }
  155. void DialogLimitEdit::showEvent(QShowEvent *event)
  156. {
  157. centerWindow();
  158. refreshData();
  159. QDialog::showEvent(event);
  160. }