選択すると境界線が緑色になり、 QGraphicsTextItemsetTextInteractionFlags(Qt::TextEditorInteraction);
クラスと同じようにテキストを変更できるカスタム テキスト項目を作成したいのですが、 QGraphicsItemクラスを継承してそのようなものを実装したいと考えています。私の質問は、オーバーライドペイントメソッドを使用してテキストアイテムにウィンクテキストカーソルを実装する方法ですか? 言い換えれば、この状況の最善の解決策は何ですか?
TextItem.h
:
#include "QGraphicsTextItem"
#include "QKeyEvent"
#include "QRectF"
class TextItem : public QGraphicsItem {
public :
TextItem(int x, int y);
QRectF boundingRect() const override;
protected:
void keyPressEvent(QKeyEvent *event) override;
public:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
~TextItem();
private:
QColor color;
int x, y, width, height;
QString text;
void onSelectItem(QPainter *pPainter);
};
とTextItem.cpp
:
#include <iostream>
#include "TextItem.h"
#include "QPainter"
#include "QTextItem"
#include "QKeyEvent"
#include "QStaticText"
#include "QStyleOptionGraphicsItem"
using namespace std;
TextItem::~TextItem() noexcept {}
TextItem::TextItem(int x, int y) : x(x),
y(y),
width(60),
height(60),
text(),
color(Qt::black) {
this->setFlags(ItemIsSelectable | ItemIsFocusable);
}
void TextItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
if (this->isSelected()) {
onSelectItem(painter);
// I think it should be draw here
// setTextEditor(painter);
}
painter->save();
painter->setRenderHint(QPainter::TextAntialiasing);
QPen pen(Qt::black);
painter->setPen(pen);
painter->setBrush(color);
painter->drawText(this->boundingRect(), text == "" ? "hello world" : text, QTextOption(Qt::AlignLeft));
painter->restore();
}
void TextItem::keyPressEvent(QKeyEvent *event) {
if (this->isSelected()) {
text += event->text();
this->update();
}
QGraphicsItem::keyPressEvent(event);
}
void TextItem::onSelectItem(QPainter *painter) {
painter->save();
QPen pen(Qt::green);
pen.setJoinStyle(Qt::MiterJoin);
pen.setWidth(2);
painter->setPen(pen);
painter->drawRect(this->boundingRect());
painter->restore();
}
QRectF TextItem::boundingRect() const {
return QRectF(x, y, width, height);
}
私の意味が正しく表現されていることを願っています。