CustomLineEdit.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include "CustomLineEdit.h"
  2. #include <QInputDialog>
  3. #include <QApplication>
  4. #include <QDebug>
  5. CustomLineEdit::CustomLineEdit(QWidget *parent)
  6. : QLineEdit(parent)
  7. , formType(General::Type::VALUE)
  8. {
  9. setReadOnly(true);// 防止直接输入,强制用对话框输入
  10. m_input_dialog.reset(new DialogEditValue());
  11. m_input_dialog->setParent(parent);
  12. m_input_dialog->setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
  13. m_input_dialog->setWindowModality(Qt::WindowModal);
  14. }
  15. CustomLineEdit::~CustomLineEdit()
  16. {}
  17. void CustomLineEdit::setText(const QString &text)
  18. {
  19. bool wasBlocked = blockSignals(true);
  20. QLineEdit::setText(text);
  21. blockSignals(wasBlocked);
  22. }
  23. bool CustomLineEdit::event(QEvent *event)
  24. {
  25. if (event->type() == QEvent::MouseButtonPress) {
  26. if (!isEnabled()) return true;
  27. m_input_dialog->setValue(text(), formType);
  28. m_input_dialog->setEditType(editType);
  29. auto ret = m_input_dialog->exec(); // 阻塞,直到窗口关闭
  30. if (ret == QDialog::Accepted) {
  31. QLineEdit::setText(m_input_dialog->getValue(formType));
  32. updateDisplayText();
  33. }
  34. }
  35. return QLineEdit::event(event);
  36. }
  37. void CustomLineEdit::setEditType(int newEditType)
  38. {
  39. editType = newEditType;
  40. }
  41. void CustomLineEdit::setFormType(int newFormType)
  42. {
  43. formType = newFormType;
  44. }
  45. void CustomLineEdit::setDisplayBase(DisplayBase base)
  46. {
  47. m_displayBase = base;
  48. updateDisplayText();
  49. }
  50. CustomLineEdit::DisplayBase CustomLineEdit::displayBase() const
  51. {
  52. return m_displayBase;
  53. }
  54. void CustomLineEdit::updateDisplayText()
  55. {
  56. bool ok = false;
  57. int value = text().toInt(&ok, 10); // 假设原始输入为十进制
  58. if (!ok) {
  59. setText(""); // 非数字清空
  60. return;
  61. }
  62. switch (m_displayBase) {
  63. case Base_Decimal:
  64. setText(QString::number(value, 10));
  65. break;
  66. case Base_Hex:
  67. setText("0x" + QString::number(value, 16).toUpper());
  68. break;
  69. case Base_Binary:
  70. setText("0b" + QString::number(value, 2));
  71. break;
  72. }
  73. }