Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Caduceus от Ноябрь 15, 2011, 11:28



Название: Как нарисовать картинку поверх контролов?
Отправлено: Caduceus от Ноябрь 15, 2011, 11:28
Как нарисовать в paintEvent  у QWidget картинку поверх всех контролов на этой Виджете?


Название: Re: Как нарисовать картинку поверх контролов?
Отправлено: GreatSnake от Ноябрь 15, 2011, 11:31
Создай на этом QWidget прозрачный QWidget и в его paint() рисуй всё что хочешь. Только не забудь его поднять выше других через raise().


Название: Re: Как нарисовать картинку поверх контролов?
Отправлено: iroln от Ноябрь 16, 2011, 19:55
А как лучше всего сделать перекрытие виджетом других виджетов и чтобы компоновщики работали?
Например, у меня на форме есть виджет в котором отображается картинка (большая картинка), мне надо поместить в уголок этого виджета, поверх него другой виджет с ещё одной маленькой картинкой (ну вроде эмуляция картинки в картинке). Получается вроде как многослойный GUI. Как такое лучше сделать в Qt?


Название: Re: Как нарисовать картинку поверх контролов?
Отправлено: andrew.k от Ноябрь 16, 2011, 21:00
Создай на этом QWidget прозрачный QWidget и в его paint() рисуй всё что хочешь. Только не забудь его поднять выше других через raise().
А что такое прозрачный виджет?


Название: Re: Как нарисовать картинку поверх контролов?
Отправлено: kambala от Ноябрь 16, 2011, 21:22
виджет с нулевой windowOpacity


Название: Re: Как нарисовать картинку поверх контролов?
Отправлено: andrew.k от Ноябрь 16, 2011, 21:44
виджет с нулевой windowOpacity
А на paintEvent это не повлияет? т.е. если в paintEvent рисовать, оно не станет прозрачным?


Название: Re: Как нарисовать картинку поверх контролов?
Отправлено: marbius от Ноябрь 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();
}
 


Название: Re: Как нарисовать картинку поверх контролов?
Отправлено: marbius от Ноябрь 19, 2011, 14:30
Я, конечно, могу и ошибаться, но:

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

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

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

Поправьте меня, если я ошибаюсь