Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как разместить один элемент поверх другого при динамическом создании окна
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
gvenihvivar
Добрый день.
Появилась необходимость сделать виджет, в котором будет карта в скроллбаре, так как она вся на экран не помещается. И нужно на этой карте в определенном месте отображать изменения параметров.
С картой проблемы нет, а вот как расположить поверх другие элементы, например Qlabel.
Trisch
А посредством чего вы добавляете туда карту?
Если с помощью QGraphicsView, то виджеты можно добавить туда с помощью QGraphicsProxyWidget
gvenihvivar
Нет я пробовала просто вставить картинку
        QScrollArea *sa = new QScrollArea;
        QPixmap *image = new QPixmap(":images/map3.jpg"); //картинка лежит в ресурсах
        QLabel* imageLabel = new QLabel();
        imageLabel->setPixmap(*image);
        imageLabel->setAlignment(Qt::AlignCenter);
        sa->setWidget(imageLabel);

и в фон
         QBrush br(Qt::TexturePattern);
         br.setTextureImage(QImage(":images/map3.jpg"));
         QPalette plt = sa->palette();
         plt.setBrush(QPalette::Background, br);
         sa->setPalette(plt);

но ни один вариант не помог добавить элемент сверху. Попробую ваш.
lanz
Чтобы разместить виджет поверх другого, сделайте его дочерним виджетом.
QScrollArea *sa = new QScrollArea;
QLabel* imageLabel = new QLabel(sa);

Потом можете передвинуть куда нужно, используя QWidget::move
gvenihvivar
У меня получилась вот такая штука и все прекрасно работает
Раскрывающийся текст
        [/expand]QMdiSubWindow *subWindow = new QMdiSubWindow;
        ui->showMap->setEnabled(false);


        QPixmap *image = new QPixmap();
        image->load(":images/map3.jpg");

        QGraphicsScene *scene = new QGraphicsScene(QRectF(0,0,image->width(),image->height()));
        scene->addPixmap(*image);

        QGraphicsRectItem* pRectItem = new QGraphicsRectItem(0, scene);
        pRectItem->setPen(QPen(Qt::black));
        pRectItem->setBrush(QBrush(Qt::lightGray));
        pRectItem->setRect(QRectF(3430, 450, 150, 120));
        pRectItem->setFlags(QGraphicsItem::ItemIsMovable);


        QGraphicsTextItem* pTextItem =
        scene->addText((tr(
                           " P,  кг/см2 %1 \n "
                           " Q,  кг/час %2 \n "
                           " Ro, кг/м3  %3 \n "
                           " T,  *С     %4 \n ")
                        .arg(p1)
                        .arg(q1)
                        .arg(r1)
                        .arg(t1)));
        pTextItem->setPos(3430,450);
        QFont serifFont("Times", 12, QFont::Bold);
        pTextItem->setFont(serifFont);
        pTextItem->setParentItem(pRectItem);

         QGraphicsView *view = new QGraphicsView (scene, subWindow);
         subWindow->setMinimumSize(ui->mdiarea->width(),(image->height())+20);
         subWindow->layout()->addWidget(view);
         ui->mdiarea->addSubWindow(subWindow);
         subWindow->setAttribute(Qt::WA_DeleteOnClose);
         subWindow->show();

Вопрос. Как сделать так, чтобы текстовые данные обновлялись раз в секунду. Я уже это update() и changed() крутила и так и этак. Подскажите как правильно прикрутить обновление
Trisch
А координаты обновленного участка сцены правильно задали?
Вы точно правильно соединили необходимые сигналы и слоты?
Как вариант можно перерисовать всю сцену с помощью QGraphicsView::updateScene ( const QList<QRectF> & rects )
или удалить содержимое сцены и отрисовать по новой.

Еще можно создать тестовую программу, к примеру, добавить на сцену таймер, и поиграться с различными вариантами его обновления, и потом уже понравившийся вариант перенести в основную программу.
gvenihvivar
Пробовала все приведенные варианты Trisch и по таймеру и по кнопке. Ничего. Работает только вот этот вариант вызываемый по таймеру. Я понимаю, что это не правильно, но как-то так.
 pTextItem->setPlainText((tr(" P,   %1 кг/см2   ").arg(p1)));


Здесь можно посмотреть тестовую программу
lanz
Почему это кажется вам неправильным?
Trisch
Цитата(gvenihvivar @ 18.9.2014, 14:09) *
Пробовала все приведенные варианты Trisch и по таймеру и по кнопке. Ничего. Работает только вот этот вариант вызываемый по таймеру. Я понимаю, что это не правильно, но как-то так.

pTextItem->setPlainText((tr(" P, %1 кг/см2 ").arg(p1)));



Здесь можно посмотреть тестовую программу



Как-то сильно мудрено, как для тестовой программы.
Обновление там не происходит, скорей всего, из за того что нечего обновлять, так как сцена не получает новые данные.

Передача сцене текстовых данных через setPlainText, вполне нормальный вариант)
gvenihvivar
Цитата(Trisch @ 18.9.2014, 20:02) *
Передача сцене текстовых данных через setPlainText, вполне нормальный вариант)

Это радует. Думала, что есть простой и правильный способ, а я опять какие-то костыли прикручиваю :)

Спасибо за помощь!
HochuNaCubu
Здравствуйте, я реализую сейчас похожий на Ваш проект - карта с нанесенными на нее QLabel, у меня возник такой вопрос - сохраняется ли у Вас положение QLabel-ов при масштабировании формы? и если да, то не могли бы Вы поделиться секретом реализации данного волшебства))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.