CTextItem.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. }
  12. void CTextItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
  13. {
  14. if (event->button() == Qt::LeftButton) { //左键双击进入可编辑状态并打开焦点
  15. if (allowEdit()) {
  16. beginEditing();
  17. }
  18. QGraphicsTextItem::mouseDoubleClickEvent(event);
  19. }
  20. }
  21. void CTextItem::keyPressEvent(QKeyEvent *event)
  22. {
  23. switch (event->key()) {
  24. case Qt::Key_Return: {
  25. endEditing();
  26. emit sigTextChanged();
  27. }
  28. }
  29. QGraphicsTextItem::keyPressEvent(event);
  30. }
  31. void CTextItem::beginEditing()
  32. {
  33. setTextInteractionFlags(Qt::TextEditorInteraction);
  34. setFocus();
  35. }
  36. void CTextItem::endEditing()
  37. {
  38. setTextInteractionFlags(Qt::NoTextInteraction);
  39. setSelected(false);
  40. clearFocus();
  41. }
  42. bool CTextItem::isEditing() const
  43. {
  44. return (textInteractionFlags() & Qt::TextEditorInteraction) == Qt::TextEditorInteraction;
  45. }
  46. bool CTextItem::allowEdit() const
  47. {
  48. return m_allowEdit;
  49. }
  50. void CTextItem::setAllowEdit(bool a)
  51. {
  52. m_allowEdit = a;
  53. endEditing();
  54. }
  55. QSizeF CTextItem::textSize(const QString t, qreal width)
  56. {
  57. qDebug() << __FUNCTION__ << __LINE__ << endl;
  58. static CTextItem *i = nullptr;
  59. if (i == nullptr) {
  60. i = new CTextItem(nullptr);
  61. }
  62. i->document()->setPlainText(t);
  63. i->setTextWidth(width);
  64. return i->document()->size();
  65. }