CTextItem.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include "CTextItem.h"
  2. #include <QKeyEvent>
  3. #include <QGraphicsSceneMouseEvent>
  4. #include <QTextDocument>
  5. #include <QDebug>
  6. CTextItem::CTextItem(QGraphicsItem *parent) : CTextItem(QString(), parent) { }
  7. CTextItem::CTextItem(const QString &text, QGraphicsItem *parent) : QGraphicsTextItem(text, parent)
  8. {
  9. setFlags(QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemIsSelectable);
  10. setTextInteractionFlags(Qt::TextEditorInteraction);
  11. connect(document(), &QTextDocument::contentsChanged, this, &CTextItem::slotTextChanged);
  12. }
  13. void CTextItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
  14. {
  15. if (event->button() == Qt::LeftButton) { //左键双击进入可编辑状态并打开焦点
  16. if (allowEdit()) {
  17. emit sigWillBeginEditing();
  18. beginEditing();
  19. }
  20. QGraphicsTextItem::mouseDoubleClickEvent(event);
  21. }
  22. }
  23. void CTextItem::keyPressEvent(QKeyEvent *event)
  24. {
  25. switch (event->key()) {
  26. case Qt::Key_Return: {
  27. endEditing();
  28. }
  29. }
  30. QGraphicsTextItem::keyPressEvent(event);
  31. }
  32. void CTextItem::beginEditing()
  33. {
  34. setTextInteractionFlags(Qt::TextEditorInteraction);
  35. setFocus();
  36. }
  37. void CTextItem::endEditing()
  38. {
  39. setTextInteractionFlags(Qt::NoTextInteraction);
  40. setSelected(false);
  41. clearFocus();
  42. if (m_textChanged) {
  43. emit sigTextChanged();
  44. m_textChanged = false;
  45. }
  46. }
  47. bool CTextItem::isEditing() const
  48. {
  49. return (textInteractionFlags() & Qt::TextEditorInteraction) == Qt::TextEditorInteraction;
  50. }
  51. bool CTextItem::allowEdit() const
  52. {
  53. return m_allowEdit;
  54. }
  55. void CTextItem::setAllowEdit(bool a)
  56. {
  57. m_allowEdit = a;
  58. if (a == false) {
  59. endEditing();
  60. }
  61. }
  62. QSizeF CTextItem::textSize(const QString t, qreal width)
  63. {
  64. static CTextItem *i = nullptr;
  65. if (i == nullptr) {
  66. i = new CTextItem(nullptr);
  67. }
  68. i->document()->setPlainText(t);
  69. i->setTextWidth(width);
  70. return i->document()->size();
  71. }
  72. void CTextItem::slotTextChanged()
  73. {
  74. m_textChanged = true;
  75. }