MatterElementItemDelegate.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #ifndef MATTERELEMENTITEMDELEGATE_H
  2. #define MATTERELEMENTITEMDELEGATE_H
  3. #include <QStyledItemDelegate>
  4. #include <QFormLayout>
  5. #include <QDoubleSpinBox>
  6. #include <QComboBox>
  7. class InsideWidget : public QFrame
  8. {
  9. Q_OBJECT
  10. public:
  11. InsideWidget(QWidget *parent = nullptr) : QFrame(parent)
  12. {
  13. QHBoxLayout *vcenter = new QHBoxLayout;
  14. vcenter->setMargin(0);
  15. vcenter->setSpacing(0);
  16. QFormLayout *layout = new QFormLayout;
  17. setStyleSheet("InsideWidget{background-color:gray} QLabel{color:white}");
  18. layout->setLabelAlignment(Qt::AlignCenter);
  19. vcenter->addSpacerItem(new QSpacerItem(10, 10, QSizePolicy::Expanding));
  20. vcenter->addLayout(layout);
  21. vcenter->addSpacerItem(new QSpacerItem(10, 10, QSizePolicy::Expanding));
  22. layout->setMargin(2);
  23. layout->setSpacing(2);
  24. for (int i = 0; i < 4; ++i) {
  25. auto s = new QDoubleSpinBox;
  26. s->setMaximumWidth(60);
  27. s->setFrame(false);
  28. s->setMinimum(-10000);
  29. s->setMaximum(10000);
  30. m_spins << s;
  31. }
  32. layout->addRow("[很差,交差]中间值:", m_spins.at(0));
  33. layout->addRow("[较差,一般]中间值:", m_spins.at(1));
  34. layout->addRow("[一般,较高]中间值:", m_spins.at(2));
  35. layout->addRow("[较高,很高]中间值:", m_spins.at(3));
  36. setLayout(vcenter);
  37. }
  38. virtual ~InsideWidget() { }
  39. QString result()
  40. {
  41. this->onConfirm();
  42. return m_result;
  43. }
  44. void setValue(const QString &value)
  45. {
  46. if (!value.isEmpty()) {
  47. QStringList tmp = value.mid(1, value.size() - 2).replace(" ", "").split(",");
  48. for (int i = 0; i < tmp.size(); ++i) {
  49. m_spins.at(i)->setValue(tmp[i].toDouble());
  50. }
  51. }
  52. }
  53. private slots:
  54. void onConfirm()
  55. {
  56. m_result = QString("[%1, %2, %3, %4]")
  57. .arg(m_spins.at(0)->value())
  58. .arg(m_spins.at(1)->value())
  59. .arg(m_spins.at(2)->value())
  60. .arg(m_spins.at(3)->value());
  61. }
  62. private:
  63. QList<QDoubleSpinBox *> m_spins;
  64. QString m_result;
  65. };
  66. class MatterElementItemSpinDelegate : public QStyledItemDelegate
  67. {
  68. Q_OBJECT
  69. public:
  70. MatterElementItemSpinDelegate(QObject *parent = 0);
  71. QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
  72. void setEditorData(QWidget *editor, const QModelIndex &index) const override;
  73. void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
  74. void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
  75. const QModelIndex &index) const override;
  76. };
  77. class MatterElementItemInsideDelegate : public QStyledItemDelegate
  78. {
  79. Q_OBJECT
  80. public:
  81. MatterElementItemInsideDelegate(QObject *parent = 0);
  82. QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
  83. void setEditorData(QWidget *editor, const QModelIndex &index) const override;
  84. void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
  85. void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
  86. const QModelIndex &index) const override;
  87. };
  88. class RangeWidget : public QFrame
  89. {
  90. Q_OBJECT
  91. public:
  92. RangeWidget(const QStringList &items, QWidget *parent = nullptr) : QFrame(parent)
  93. {
  94. QFormLayout *layout = new QFormLayout;
  95. setStyleSheet("RangeWidget{background-color:gray}");
  96. layout->setMargin(10);
  97. layout->setSpacing(2);
  98. m_leftCombInput = new QComboBox();
  99. m_leftCombInput->setMaxVisibleItems(15);
  100. m_leftCombInput->setEditable(true);
  101. m_leftCombInput->addItems(items);
  102. m_leftCombInput->setCurrentIndex(0);
  103. m_rightCombInput = new QComboBox();
  104. m_rightCombInput->setMaxVisibleItems(15);
  105. m_rightCombInput->setEditable(true);
  106. m_rightCombInput->addItems(items);
  107. m_rightCombInput->setCurrentIndex(0);
  108. layout->addRow("左:", m_leftCombInput);
  109. layout->addRow("右:", m_rightCombInput);
  110. setLayout(layout);
  111. }
  112. virtual ~RangeWidget() { }
  113. QStringList result() { return { m_leftCombInput->currentText(), m_rightCombInput->currentText() }; }
  114. void setValue(const QString &lValue, const QString &rValue)
  115. {
  116. m_leftCombInput->setCurrentText(lValue);
  117. m_rightCombInput->setCurrentText(rValue);
  118. }
  119. private:
  120. QComboBox *m_leftCombInput;
  121. QComboBox *m_rightCombInput;
  122. };
  123. class MatterElementItemRangeDelegate : public QStyledItemDelegate
  124. {
  125. Q_OBJECT
  126. public:
  127. MatterElementItemRangeDelegate(QObject *parent = 0);
  128. QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
  129. void setEditorData(QWidget *editor, const QModelIndex &index) const override;
  130. void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
  131. void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
  132. const QModelIndex &index) const override;
  133. void setOriginItems(const QStringList &originItems, const QVector<double> &originValues);
  134. void updateOriginValues(const QVector<double> &values);
  135. private:
  136. QStringList m_originItems;
  137. QVector<double> m_originValues;
  138. };
  139. #endif // MATTERELEMENTITEMDELEGATE_H