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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: grabWidget  (Прочитано 4936 раз)
jurtal
Гость
« : Январь 18, 2011, 12:06 »

Привет! Нужна помощь...
Делаю
QPixmap preview = QPixmap::grabWidget(m_labelCtrl->getControl());

И рисую этот пиксмап... В результате этот виджет отрисовывается на каком-то сером фоне, хотя тот который я граблю может быть на фоне другого цвета...
Не пойму, что за серый фон...
Записан
dd
Гость
« Ответ #1 : Январь 18, 2011, 12:11 »

QPixmap preview(m_labelCtrl->getControl()->size());
preview.fill(Qt::transparent);

далее render примерно так

m_labelCtrl->getControl()->render(&preview);
« Последнее редактирование: Январь 18, 2011, 12:17 от dd » Записан
jurtal
Гость
« Ответ #2 : Январь 18, 2011, 14:58 »

не, не получается так... он все равно на сером фоне...
Записан
dd
Гость
« Ответ #3 : Январь 18, 2011, 15:02 »

А что это за виджет то вообще?
Видимо с ним какая-то проблема.
Я отрисовываю вышеописанным способом у себя в программе и пролем с фоном нет.

----------------------

А может быть и проблемы нет?
Возможно нет понимания просто?
Виджет рендерится без фона. То есть прозрачный фон.
Потом ты отрисовываешь картинку на сером фоне, его и получаешь.

Если нужно грабить как-то по-другому, см. описание ф-ии
void QWidget::render ( QPaintDevice * target, const QPoint & targetOffset = QPoint(), const QRegion & sourceRegion = QRegion(), RenderFlags renderFlags = RenderFlags( DrawWindowBackground | DrawChildren ) ), а именно флагов.
« Последнее редактирование: Январь 18, 2011, 15:08 от dd » Записан
jurtal
Гость
« Ответ #4 : Январь 18, 2011, 15:10 »

Наследованный от QLabel widget. В paintEvent ему задается цвет фона, рамка итд.... Но если цвета фона нет (прозрачный label), то когда он грабится ему добавляется серый фон, который не нужен.
Записан
dd
Гость
« Ответ #5 : Январь 18, 2011, 15:15 »

А если для прозрачности сделать заливку цветом Qt::transparent ?
Если сам отрислвываешь виджет, зачем использовать QLabel? Может QWidget сразу?
Записан
jurtal
Гость
« Ответ #6 : Январь 18, 2011, 15:18 »

Заливку чего? Сам label рисуется прозрачным. Но когда я отрисовываю сграбленный битмап, то этот битмап этот содержит серый фон.
Записан
dd
Гость
« Ответ #7 : Январь 18, 2011, 15:37 »

[изменил код и скрин на более наглядный]

Нашел решение.
Создал пустой проект, вот код главного окна:


Код:
#include "mainwindow.h"
#include <QPainter>
#include <QLabel>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QLabel *pLabel = new QLabel("test test test test test test test test test test ", this);
    pLabel->setGeometry(0, 0, 200, 100);

    m_Pixmap = QPixmap(pLabel->size());
    m_Pixmap.fill(Qt::transparent);
    pLabel->render(&m_Pixmap, QPoint(), QRegion(), IgnoreMask);
    setGeometry(200, 200, 500, 500);
}

MainWindow::~MainWindow()
{

}

void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);

    painter.setBrush(QBrush(QColor(0, 200, 0)));

    painter.drawRect(QRect(QPoint(), size()).adjusted(100, 0, 0, 0));

    painter.drawPixmap(
            50, 100,
            m_Pixmap.width(),
            m_Pixmap.height(),
            m_Pixmap
            );
}

Вот результат:


То есть рисуется сначала QLabel 200 на 100
Потом рисуется пиксмап, начиная с X=50, то есть часть на сером фоне, часть на зеленом.
Как видно, никакого фона нет.

Вот тестовый проект http://webfiles.ru/21398986
« Последнее редактирование: Январь 18, 2011, 15:57 от dd » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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