Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > QGraphicsView и панель с кнопками в углу


Автор: becks 7.5.2013, 14:06
Добрый день, хочу на 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);
    }
}


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

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

Автор: Sovereign 8.5.2013, 07:43
У QGraphicsItem можно установить флаг ItemIgnoresTransformations, попробуй с ним.

Автор: becks 8.5.2013, 11:19
Цитата

У 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()));
    }

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)