Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QGraphicsView и панель с кнопками в углу 
:(
    Опции темы
becks
Дата 7.5.2013, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.7.2010

Репутация: нет
Всего: нет



Добрый день, хочу на QGraphicsView сделать,например, в нижнем правом углу прозрачную панель с кнопками, чтобы при прокрутке, ресайзе и прочем она всегда оставалась на своем месте. Делаю через QGraphicsProxyWidget:

Код

QGraphicsProxyWidget *m_proxyWidget;
...
void Document::createVisualModePanel(QGraphicsScene *scene)
{
    QWidget *widget = new QWidget;
    QPushButton *btn_full_mode = new QPushButton("Full", this);
    QPushButton *btn_simple_mode = new QPushButton("Simple", this);

    QVBoxLayout *layout = new QVBoxLayout;

    layout->addWidget(btn_full_mode);
    layout->addWidget(btn_simple_mode);

    widget->setLayout(layout);
    m_proxyWidget = scene->addWidget(widget);
}


Теперь делаю реакцию на ресайз и скроллы:
Код

void Document::resizeEvent(QResizeEvent *event)
{
    QGraphicsView::resizeEvent(event);
    if (m_proxyWidget)
    {
        QPointF p = mapToScene( viewport()->width(), viewport()->height());
        m_proxyWidget->setPos(p - QPointF(m_proxyWidget->size().width(), m_proxyWidget->size().height()));
    }
}

void Document::scrollContentsBy(int dx, int dy)
{
    QGraphicsView::scrollContentsBy(dx, dy);
    if (m_proxyWidget)
    {
        QPointF p = mapToScene( m_proxyWidget->pos().x() + dx, m_proxyWidget->pos().y() + dy );
        m_proxyWidget->setPos(p);
    }
}


Получается сущая ерунда, при скроле она улетает непонятно куда. Скорее всего я неправильно вычисляю новые координаты. Но сам подход правильный?

И только что заметил, что при изменении масштаба виджет тоже изменяет масштаб, можно ли как-нибудь запретить ему менять масштаб?

Это сообщение отредактировал(а) becks - 7.5.2013, 14:13
PM MAIL   Вверх
Sovereign
Дата 8.5.2013, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 7.11.2006

Репутация: 1
Всего: 4



У QGraphicsItem можно установить флаг ItemIgnoresTransformations, попробуй с ним.
PM MAIL   Вверх
becks
Дата 8.5.2013, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.7.2010

Репутация: нет
Всего: нет



Цитата

У QGraphicsItem можно установить флаг ItemIgnoresTransformations, попробуй с ним.


Ага, вечером уже вчера сделал. И переделал  scrollContentsBy:

Код

void Document::scrollContentsBy(int dx, int dy)
{
    QGraphicsView::scrollContentsBy(dx, dy);

    if (m_proxyWidget)
    {
        QPointF p = mapToScene( viewport()->width(), viewport()->height());
        m_proxyWidget->setPos(p - QPointF(m_proxyWidget->size().width(), m_proxyWidget->size().height()));
    }
}


Теперь панель не изменяет размер при scale и при прокрутке оказывается в нужном месте.

Остались следующие проблемы:

1) При прокрутке бывает остается шлейф от панельки.
2) При scale панель теперь размер не изменяет, но по чуть-чуть съезжает, по скольку пересчета положения не происходит. Я делал после scale:
Код

    if (m_proxyWidget)
    {
        QPointF p = mapToScene( viewport()->width(), viewport()->height());
        m_proxyWidget->setPos(p - QPointF(m_proxyWidget->size().width(), m_proxyWidget->size().height()));
    }

но ничего не изменилось 

Это сообщение отредактировал(а) becks - 8.5.2013, 11:20
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0867 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.