Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Qt

Войти
Регистрация
Восстановить пароль
 
Sanek_MX
1 / 1 / 0
Регистрация: 08.04.2012
Сообщений: 52
#1

QGraphicsTextItem внутри QGraphicsItem - C++ Qt

05.01.2017, 19:09. Просмотров 380. Ответов 4
Метки нет (Все метки)

Внутри QGraphicsItem по центру находится QGrapihcsTextItem. Хочу, чтобы textitem был редактируемым и чтобы item(рамка) при вводе/удалении текста тут же(одновременно) меняла размер. Пока нашел 2 способа:
1) у textitem установить флаги
C++ (Qt)
1
2
setFlag( ItemIsFocusable);
setTextInteractionFlags(Qt::TextEditorInteraction);
тогда вокруг текста появляется ненужная пунктирная рамка, а сигнал о изменении текста у меня вышло испускать только тогда, когда человек уже закончил редактировать текст
C++ (Qt)
1
itemChange(GraphicsItemChange change, const QVariant &value)
2) переопределить нажатие клавиши
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
void NodeTextItem::keyPressEvent(QKeyEvent *event)
{
    QString s = toPlainText();
    if (event->key()!= Qt::Key_Backspace)
        setPlainText(s + event->text());
    else
    {
        if (s.size() > 1)
            setPlainText( s.remove(s.size()-1,1) );
    }
 
    emit selectedChange(this);
}
Слот, обрабатывающий сигнал меняет рамку item, подстраивая ее под размер текста.

Но тогда нет текстового курсора и поэтому получается добавлять буквы только в конец, но зато рамка у item одновременно изменяется с вводом букв

Подскажите, пожалуйста, как сделать так, чтобы и был текстовый курсор, чтобы можно было менять текст внутри нормально и чтобы рамка изменялась одновременно с вводом текста, и чтобы не было лишней пунктирной рамки вокруг текста.

Добавлено через 1 час 55 минут
Все разобрался почти. Проблему частично решил:
В textitem
C++ (Qt)
1
2
3
4
5
void NodeTextItem::keyPressEvent(QKeyEvent *event)
{
    QGraphicsTextItem::keyPressEvent(event);
    emit nodeTextChange(this);
}
И оставить флаги
C++ (Qt)
1
2
    setFlag( ItemIsFocusable);
    setTextInteractionFlags(Qt::TextEditorInteraction);
Теперь item(рамка) одновременно меняется. Правда от пунктирной рамки вокруг текста не избавился и курсор почему-то после ввода буквы сразу же в начало переходит
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2017, 19:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос QGraphicsTextItem внутри QGraphicsItem (C++ Qt):

No matching function for call to 'QGraphicsTextItem::QGraphicsTextItem(int, myClass*)' - C++ Qt
Здравствуйте, следующая проблема: Не хочет зараза компилироваться проект, я его разрабатывал давно уже в NetBeans и нормально...

Qt 5. Включение QGraphicsItem в класс QGraphicsItem - C++ Qt
Здравствуйте! Я, естессвенно, новичок в Qt :) Задача, вобщем-то, банальна: нужно сделать отображение и редактор полигонов. На...

QGraphicsTextItem - C++ Qt
народ, помоге плз как задать цвет текста в этом объексте? QPainter использовать нельзя. все рисуется на QGraphicsScene. как ни...

Вывод на сцену QGraphicsTextItem. Русские буквы. Qt - C++ Qt
Знаю как выводить просто "текст" используя tr(), но как вывести переменную? ... int num=stepY*10; ... ...

Как вписать QGraphicsTextItem в какую - то прямоугольную область ? - C++ Qt
Есть прямоугольный виджет, создаю QGraphicsTextItem и делаю его родителем этот виджет. Хочу, чтоб баундари рекст QGraphicsTextItem был...

Qt:QGraphicsItem - C++ Qt
Доброго времени суток, товарищи! Имеется класс, унаследованный от QGraphicsItem. Графически представляет себя как квадрат с границами....

4
dondublon
1213 / 903 / 102
Регистрация: 17.03.2012
Сообщений: 6,041
Записей в блоге: 5
06.01.2017, 15:21 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Можно через QGraphicsProxyWidget.
1
Sanek_MX
1 / 1 / 0
Регистрация: 08.04.2012
Сообщений: 52
07.01.2017, 20:43  [ТС] #3
Спасибо. Действительно QLineEdit в QGraphicsProxyWidget куда удобнее. Но не знаете случайно, как переопределить mouseEventы так, чтобы proxyWidget не реагировал на клики мыши, кроме как на двойной щелчок. Просто в визио, например, блок с текстом можно двигать по сцене, но как только двойной щелчок по блоку, то редактирование текста.
0
dondublon
1213 / 903 / 102
Регистрация: 17.03.2012
Сообщений: 6,041
Записей в блоге: 5
11.01.2017, 15:35 #4
Увы, нет. Насколько я помню, в Qt c двойными кликами вообще тяжко.
0
Sanek_MX
1 / 1 / 0
Регистрация: 08.04.2012
Сообщений: 52
13.01.2017, 20:27  [ТС] #5
Оказалось возможно:
у proxywidget с qlineedit или(textitem) изначально установить
C++ (Qt)
1
setAcceptedMouseButtons( Qt::NoButton );
то есть текст не реагирует вообще на мышку, а реагирует родитель, который moveable
А у graphicsitem(или graphicsobject) родительского на двойной клик мыши поставить:
C++ (Qt)
1
2
3
4
5
void Node::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{
    isEdit = true;
    textItem->setAcceptedMouseButtons(Qt::AllButtons);
}
тогда "текст" можно редактировать, но двигать нельзя. И чтобы в исходную вернуться:
C++ (Qt)
1
2
3
4
5
6
7
8
9
void NodeTextItem::focusOutEvent(QFocusEvent *event)
{
    if (isEdit == true)
            {
                isEdit = false;
                setAcceptedMouseButtons(Qt::NoButton);
            }
    QGraphicsProxyWidget::focusOutEvent(event);
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2017, 20:27
Привет! Вот еще темы с ответами:

QGraphicsItem + картинка - C++ Qt
Добрый день! Как можно отобразить свое изображение (png) на QGraphicsItem или QGraphicsRectItem?

QGraphicsItem::ItemIsMovable - C++ Qt
Подскажите пожалуйста как настроить этот флаг так чтобы при перемещение перемещало итем по(например)15 пикселей, а не плавно

Qt. Не масштабировать QGraphicsItem - C++ Qt
Доброго времени суток. Есть карта созданная с помощью QGraphicsScene и QGraphicsView). На карту должны помещаться разные элементы...

Анимация с QGraphicsItem - C++ Qt
Hello World! На борту 5.3.0 Нашёл это http://qt-project.org/doc/qt-4.8/animation-overview.html и смотря на секцию Animations...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
13.01.2017, 20:27
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru