Подкласс QGraphicsLayoutItem и QGraphicsTextItem - PullRequest
0 голосов
/ 10 апреля 2019

Я хочу создать макет сетки с текстовыми элементами, и я хочу, чтобы этот макет обновлялся после добавления текста в текстовый элемент, но это не работает.Вот фрагмент моего исходного кода:

MyItem::MyItem(const QString &text, QGraphicsLayout* layout, QGraphicsItem *parent):
    QGraphicsLayoutItem(),
    QGraphicsTextItem(parent),
    mLayout(layout)
{
    setGraphicsItem(this);

    setHtml(text);

    setFlag(QGraphicsItem::ItemIsSelectable, true);
}

void MyItem::setGeometry(const QRectF &geom)
{
    prepareGeometryChange();
    QGraphicsLayoutItem::setGeometry(geom);
    setPos(geom.topLeft());
}

QSizeF MyItem::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
{
    return boundingRect().size();
}

void MyItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    if (event->button() == Qt::LeftButton && textInteractionFlags() == Qt::NoTextInteraction) {
        setTextInteractionFlags(Qt::TextEditorInteraction);
    }

    QGraphicsTextItem::mousePressEvent(event);
}

void MyItem::focusOutEvent(QFocusEvent *event)
{
    setTextInteractionFlags(Qt::NoTextInteraction);
    auto cursor = textCursor();
    cursor.clearSelection();
    setTextCursor(cursor);
    QGraphicsTextItem::focusOutEvent(event);
}

void MyItem::keyPressEvent(QKeyEvent *event)
{
    QGraphicsTextItem::keyPressEvent(event);

    qDebug() << boundingRect();

    updateGeometry();
    mLayout->activate();
}

В результате, когда я добавляю текст к текстовому элементу и его ширина увеличивается, следующая ячейка не перемещается, чтобы создать место для первой ячейки:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    auto scene = new QGraphicsScene;
    auto layout = new QGraphicsGridLayout;

    auto t1 = new MyItem("cell1", layout);
    layout->addItem(t1, 0, 0);
    auto t2 = new MyItem("cell2", layout);
    layout->addItem(t2, 0, 1);

    auto container = new QGraphicsWidget;
    container->setLayout(layout);
    scene->addItem(container);

    auto view = new QGraphicsView(scene);
    setCentralWidget(view);
    resize(800, 600);
}

1 Ответ

0 голосов
/ 12 апреля 2019

Добавление mLayout->updateGeometry(); в void MyItem::keyPressEvent(QKeyEvent *event) метод решило мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...