LINUX.ORG.RU

Qt, QGraphics View и Scena, обрезается область отображения

 


0

1

Привет,

Есть QGraphicsView на нем scena,

На scene графический объект(А) унаследованный от QGraphicsWidget( своеобразное окно, которое можно двигать)

На scenу добавляю так же еще объект(Б) унаследованный от QGraphicsObject( привязываю Б к А, то есть когда двигаю А двигается Б)

Почему то Б отображается только в некоторой области scenы, то есть передвигаю А в край scenы Б исчезает, возвращаю А - Б снова появляется( надо чтобы Б было видно всегда)

В чем может быть причина?

Ответ на: В кривых руках? от anonymous

Скорее всего именно в них

Код такой:

Создание scene и view:

...
scene = new ProcScene;
    view = new QGraphicsView( scene, this);

    scene->setItemIndexMethod(QGraphicsScene::NoIndex);
    scene->setBackgroundBrush(Qt::green);


    view->setRenderHint(QPainter::Antialiasing);
    view->setCacheMode(QGraphicsView::CacheBackground);
    view->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
    view->setDragMode(QGraphicsView::ScrollHandDrag);
    this->setWindowTitle(QT_TRANSLATE_NOOP(QGraphicsView, QString::fromUtf8("Процессы")));
    view->resize(1000, 800);
    this->setMaximumSize(1000, 800);
    view->show();
...
Объект Б:
class MessInScene : public QGraphicsObject
...
void MessInScene::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QString imgPath = "";
    if(this->stateNow == SEND)
        imgPath = "/home/anton/qtProject/testHighlight/images/letterOut.jpg";
    else if(this->stateNow == RECV)
        imgPath = "/home/anton/qtProject/testHighlight/images/letterIn.jpg";
    else
        imgPath = "/home/anton/qtProject/testHighlight/images/letter.jpg";
    painter->drawPixmap(0, 0, QPixmap(imgPath));
    painter->drawText(2, 10, QString::number(this->to_who));
}
QRectF MessInScene::boundingRect() const
{
    return QRectF(position.x(),position.y(), 40, 37);
}
void MessInScene::adjust() //вызывается при изменение Б, как в примере Elastic Node
{
    if(!proc)
        return;
    QPointF ptn = proc->pos();
    ptn.setX(ptn.x() + proc->boundingRect().right() - 20);
    if(stateNow == SEND)
        ptn.setY(ptn.y() - 20);
    else
        ptn.setY(ptn.y() + proc->boundingRect().bottom() - 20);
    displace(ptn);
    position = ptn;
    this->setPos(position);
}
Объект А:
class Process :  public QGraphicsWidget
...
Process::Process()
    : QGraphicsWidget(0, Qt::Window | Qt::CustomizeWindowHint | Qt::WindowTitleHint)
{
    this->setMinimumSize(100, 100);
    this->setPreferredSize(200, 2);
}

void Process::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *)
{
    QRectF rectForText(this->boundingRect());
    rectForText.setLeft(2);
    rectForText.setTop(5);
    rectForText.setBottom(20);
    painter->drawText(rectForText, this->codeInWork);
    painter->drawLine(-2, 24, this->boundingRect().width() - 2, 24);
    if(!variables.empty())
    {
        QMap<QString, QMap<QString, QString> >::const_iterator it = variables.begin();
        int i = 0;
        while (it != variables.end())
        {
            QMap<QString, QString>::const_iterator it2 = it.value().begin();
            rectForText.setTop(20 + 15 * i);
            rectForText.setBottom(35 + 15 * i);
            painter->drawText( rectForText, it2.key() + ":");
            rectForText.setTop(20 + 15 * (i + 1));
            rectForText.setBottom(35 + 15 * (i + 1));
            painter->drawText(rectForText, it2.value());
            i += 2;
            ++it;
        }
        if(this->boundingRect().bottom() < rectForText.bottom())
        {
            this->setMinimumSize(this->boundingRect().right(), rectForText.bottom());
            this->resize(this->boundingRect().right(), rectForText.bottom());
            this->updateGeometry();
        }
    }
}

Antonavt
() автор топика
Ответ на: комментарий от Antonavt

Другой вопрос, можно ли сделать так чтобы объект Б постоянно рисовался поверх А?

То есть у меня если нарисовать Б поверх А его видно, но если передвинуть А то объект А начинает закрывать Б.

Antonavt
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.