crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Как разместить один элемент поверх другого при динамическом создании окна
gvenihvivar
  опции профиля:
сообщение 16.9.2014, 16:42
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 6.11.2013
Пользователь №: 3967

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день.
Появилась необходимость сделать виджет, в котором будет карта в скроллбаре, так как она вся на экран не помещается. И нужно на этой карте в определенном месте отображать изменения параметров.
С картой проблемы нет, а вот как расположить поверх другие элементы, например Qlabel.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 16.9.2014, 20:43
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


А посредством чего вы добавляете туда карту?
Если с помощью QGraphicsView, то виджеты можно добавить туда с помощью QGraphicsProxyWidget
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
gvenihvivar
  опции профиля:
сообщение 17.9.2014, 9:15
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 6.11.2013
Пользователь №: 3967

Спасибо сказали: 0 раз(а)




Репутация:   0  


Нет я пробовала просто вставить картинку
        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
  опции профиля:
сообщение 17.9.2014, 10:12
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


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

Потом можете передвинуть куда нужно, используя QWidget::move
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
gvenihvivar
  опции профиля:
сообщение 17.9.2014, 12:52
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 6.11.2013
Пользователь №: 3967

Спасибо сказали: 0 раз(а)




Репутация:   0  


У меня получилась вот такая штука и все прекрасно работает
Раскрывающийся текст
        [/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
  опции профиля:
сообщение 17.9.2014, 14:08
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


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

Еще можно создать тестовую программу, к примеру, добавить на сцену таймер, и поиграться с различными вариантами его обновления, и потом уже понравившийся вариант перенести в основную программу.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
gvenihvivar
  опции профиля:
сообщение 18.9.2014, 14:09
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 6.11.2013
Пользователь №: 3967

Спасибо сказали: 0 раз(а)




Репутация:   0  


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


Здесь можно посмотреть тестовую программу
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 18.9.2014, 15:20
Сообщение #8


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Почему это кажется вам неправильным?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 18.9.2014, 20:02
Сообщение #9


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


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

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



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



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

Передача сцене текстовых данных через setPlainText, вполне нормальный вариант)

Сообщение отредактировал Trisch - 18.9.2014, 20:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
gvenihvivar
  опции профиля:
сообщение 19.9.2014, 20:26
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 6.11.2013
Пользователь №: 3967

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

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

Спасибо за помощь!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 19:04