Russian Qt Forum
Сентябрь 30, 2024, 18:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как нарисовать картинку поверх контролов?  (Прочитано 5350 раз)
Caduceus
Гость
« : Ноябрь 15, 2011, 11:28 »

Как нарисовать в paintEvent  у QWidget картинку поверх всех контролов на этой Виджете?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Ноябрь 15, 2011, 11:31 »

Создай на этом QWidget прозрачный QWidget и в его paint() рисуй всё что хочешь. Только не забудь его поднять выше других через raise().
Записан

Qt 5.11/4.8.7 (X11/Win)
iroln
Гость
« Ответ #2 : Ноябрь 16, 2011, 19:55 »

А как лучше всего сделать перекрытие виджетом других виджетов и чтобы компоновщики работали?
Например, у меня на форме есть виджет в котором отображается картинка (большая картинка), мне надо поместить в уголок этого виджета, поверх него другой виджет с ещё одной маленькой картинкой (ну вроде эмуляция картинки в картинке). Получается вроде как многослойный GUI. Как такое лучше сделать в Qt?
Записан
andrew.k
Гость
« Ответ #3 : Ноябрь 16, 2011, 21:00 »

Создай на этом QWidget прозрачный QWidget и в его paint() рисуй всё что хочешь. Только не забудь его поднять выше других через raise().
А что такое прозрачный виджет?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #4 : Ноябрь 16, 2011, 21:22 »

виджет с нулевой windowOpacity
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
andrew.k
Гость
« Ответ #5 : Ноябрь 16, 2011, 21:44 »

виджет с нулевой windowOpacity
А на paintEvent это не повлияет? т.е. если в paintEvent рисовать, оно не станет прозрачным?
Записан
marbius
Гость
« Ответ #6 : Ноябрь 19, 2011, 14:22 »

Создай на этом QWidget прозрачный QWidget и в его paint() рисуй всё что хочешь. Только не забудь его поднять выше других через raise().

Дополнительно нужно сделать так, чтобы "прозрачный" виджет не получал события от мыши, установкой setAttribute(Qt::WA_TransparentForMouseEvents)

Примерно так:
Код
C++ (Qt)
#include <QtGui/QApplication>
 
#include <QMainWindow>
#include <QWidget>
 
#include <QPainter>
 
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
 
 
class TransparentWidget : public QWidget
{
       Q_OBJECT
 
   public:
       explicit TransparentWidget(QWidget *parent=0) : QWidget(parent)
       {
           setFocusPolicy(Qt::NoFocus);
           setAttribute(Qt::WA_TransparentForMouseEvents);
       }
 
   private:
       void paintEvent(QPaintEvent *pe)
       {
           QPainter p(this);
           p.setPen(Qt::red);
           p.drawLine(0,0,400,400);
       }
};
 
#include "main.moc"
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   QMainWindow mw;
 
   QLabel          lbl("I'm a label",&mw);
   QLineEdit       edt("I'm an edit",&mw);
   QPushButton     btn("I'm a button",&mw);
 
   lbl.setGeometry(20,20,100,20);
   edt.setGeometry(100,100,100,20);
   btn.setGeometry(300,200,80,30);
 
   mw.connect(&btn,SIGNAL(clicked()),qApp,SLOT(quit()));
 
   mw.resize(400,400);
 
   TransparentWidget   w;
   w.setParent(&mw);
   w.setGeometry(mw.geometry());
   w.raise();
 
   mw.show();
 
   return a.exec();
}
 
« Последнее редактирование: Ноябрь 19, 2011, 15:18 от µarbius » Записан
marbius
Гость
« Ответ #7 : Ноябрь 19, 2011, 14:30 »

Я, конечно, могу и ошибаться, но:

А что такое прозрачный виджет?
В данном контексте прозрачный виджет - это виждет, у которого нет фона (background). См. справку для QWidget::autoFillBackground

виджет с нулевой windowOpacity
windowOpacity влияет только на top-level виджеты (по крайней мере для Qt 4.7.3 win), т.е. виджеты, у которых parent=0.

А на paintEvent это не повлияет? т.е. если в paintEvent рисовать, оно не станет прозрачным?
Повлияет: все наследники дочерние виджеты также будут прозрачными.

Поправьте меня, если я ошибаюсь
« Последнее редактирование: Ноябрь 19, 2011, 16:40 от µarbius » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.118 секунд. Запросов: 23.