Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2011, 19:38   #1
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
Вопрос Работа с графикой в Qt

Мозги кипят!! Решил сделать лабу по визуальному программирования используя Qt в Qt Creator, пару тук сделал, но когда понадобились элементарные вещи по рисованию данных на компонентах все встало! Но по мимо этого есть еще вопросы...
1. В общем нужно анализировать содержимое clipboard и определенные вещи выводить в разные компоненты.
Текст в мемо
Картинки в TImage1
MetaFile в TImage2
Загвоздка в MetaFile, никогда с ними не работал и даже не представляю в каком виде они приходят, но в конце концов решил просто обрабатывать имена копируемых файлов и если он имеет расширение wmf или emf то грузить его и выводить. Как? В Qt я не нашел классов для работы с метафайлами... В конце концов дополнил список др. расширениями
Код:
...
QStringList fmt;
    fmt << ".jpg" << ".jpeg" << ".wmf" << ".emf" << ".png" << ".ico";
    if(mimeData->hasFormat("FileName")){
        QString fileName(mimeData->data("FileName").data());
        //ui->textEdit->insertPlainText(fileName);
        QFileInfo pathInfo(fileName);
        if(pathInfo.exists()){
            for(int i=0; i<fmt.length(); i++)
            {
                if(pathInfo.fileName().indexOf(fmt[i],0,Qt::CaseInsensitive)==(pathInfo.fileName().length()-fmt[i].length())){
                    QPixmap pm(fileName);
                    setVectorImage(pm);
                }
            }
        }
    }else if (mimeData->hasImage()) {
        setImage(qvariant_cast<QPixmap>(mimeData->imageData()));
...
2.
Цитата:
Произвести все возможные операции копирования. Например, если в буфере обмена был текст, то после вставки его в поле TMemo его нужно также отобразить в обоих изображениях (TCanvas::TextOut). Учесть, что текст может располагаться более чем на одной строке (TCanvas::TextHeight). Если в буфере обмена содержится растровое изображение, оно должно также рисоваться на векторном, и наоборот (TCanvas::Draw).
Тут полная жеееееесть!!! Извращался целый день, так и не решил эту задачу! Я пробовал создавать отдельный QPicture и рисовать туда, но каждый раз когда я связываю его с QPainter, то старое изображение стирается...
Код:
    QPicture buf(PixMap1);
    QPainter painter(&PixMap1);
    painter.drawPicture(0,0,buf);
    painter.setPen(Qt::blue);
    painter.setFont(QFont("Arial", 30));
    painter.drawText(0,0, "Qt");
    painter.setPen( QPen(Qt::red, 10));
    painter.drawPoint(0,0);
    painter.end();

    ui->label_5->setPicture(PixMap1);
Даже это не работает! Тут ломается вся логика вообще в принципе! Правда поменяв местами PixMap1 и buf все работает, но ужасно криво!
Код:
    QPicture buf;
    QPainter painter(&buf);
    painter.drawPicture(0,0,PixMap1);
    painter.setPen(Qt::blue);
    painter.setFont(QFont("Arial", 30));
    painter.drawText(0,0, "Qt");
    painter.setPen( QPen(Qt::red, 10));
    painter.drawPoint(0,0);
    painter.end();
    PixMap1 = buf;
    ui->label_5->setPicture(PixMap1);
С остальным думаю справлюсь, если все картинки будет храниться в отдельных переменных, т.к. потом потребуется их менять:
Цитата:
4.*При двойном щелчке мышью на любом из изображений должна появляться новая форма (размеры – во весь экран, без бордюра, поверх всех окон) с данным изображением.
5.*Инвертирование растрового изображения. Добавить на форму компонент TRadioGroup для выбора способа инвертирования (через Pixels либо ScanLine) и кнопку для активации инвертирования.
6.*Управление прозрачностью растрового изображения. Добавить на форму переключатель TCheckBox для включения или выключения прозрачности TBitmap. Если прозрачность включена, то разрешать доступ к компоненту TRadioGroup для выбора режима прозрачности. При выборе фиксированного режима разрешить выбор прозрачного цвета (TComboBox с выбором стандартных цветов, написанный ранее + TButton и TColorDialog для выбора нестандартных цветов).
7.*Масштабирование. Тот момент, когда текст или изображение вставляются из буфера обмена, считается началом истории масштабирования. Т.е. считаем, что изображения имеют масштаб 100%, а размер шрифта поля TMemo устанавливаем такой, который был по умолчанию. Далее, при изменении размеров формы, масштаб изображений и шрифта TMemo должны меняться пропорционально изменению размеров.
Блин, на билдере бы уже все сделал... Но хочу с Qt разобраться...
Вот в общем

Последний раз редактировалось Kostia; 20.02.2011 в 22:53.
Kostia вне форума Ответить с цитированием
Старый 20.02.2011, 21:38   #2
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

2)

Цитата:
QPicture buf(PixMap1);
QPainter painter(&PixMap1);
painter.drawPicture(0,0,buf);
painter.setPen(Qt::blue);
painter.setFont(QFont("Arial", 30));
painter.drawText(0,0, "Qt");
painter.setPen( QPen(Qt::red, 10));
painter.drawPoint(0,0);
painter.end();

ui->label_5->setPicture(PixMap1);
Что такое PixMap1, что такое buf?
Вообще, как-то так:
Код:
// подразумевается, что тут мы уверены, что в буфере картинка
QPicture picture_to_draw;
QPainter painter(0, 0, picture_to_draw);
painter.drawPicture(QApplication::clipboard()->image());
painter.setPen(Qt::blue);
painter.setFont(QFont("Arial", 30));
painter.drawText(0, 0, "Qt");
painter.setPen(QPen(Qt::red, 10));
painter.drawPoint(0,0);
painter.end();
ui->label_5->setPicture(picture_to_draw);
1)
Цитата:
Картинки в TImage1
MetaFile в TImage2
А разве есть разница между картинкой и metafile? Разве metafile не является подмножеством множества "картинки"?
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 20.02.2011 в 22:00.
Obey-Kun вне форума Ответить с цитированием
Старый 20.02.2011, 22:52   #3
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

PixMap1
Изначально это был QPixmap, затем QPicture
Мне требуется просто нарисовать что-то(еще картинку или текст) поверх компонента и иметь возможность работать с каждым пикселем непосредственно. Аналог TCanvas в delphi. Да даже хотя бы рисовать в QPicture так чтобы старое изображение не затиралось
Код:
void MainWindow::setVectorImage(const QPixmap pmap)
{
    QPainter painter(&PixMap1);
    painter.drawPixmap(0,0,pmap);
    ui->label_5->setPicture(PixMap1);
}
Весь бред состоит в том, что я не могу создать экземпляр объекта QPixmap pmap(*ui->label_5->pixmap());
или просто ьупо что-то нарисовать, типа ui->label_5->draw(0,0,Picture); или ui->label_5->pixels[i][j]=...
__________________________
Пока решил обходиться так:
Код:
    QPicture buf;
    QPainter painter;
    painter.begin(&buf);
    painter.drawPicture(0,0,PixMap1);
    painter.setPen(Qt::blue);
    painter.setFont(QFont("Arial", 30));
    painter.drawText(0,0,ui->label_5->width(),ui->label_5->height(),
                     Qt::TextWordWrap, ui->textEdit->document()->toPlainText());
    painter.end();
    PixMap1 = buf;

    ui->label_5->setPicture(PixMap1);
PS: WMF (англ. Windows MetaFile) — универсальный формат векторных графических файлов для Windows приложений.(http://ru.wikipedia.org/wiki/Windows_Metafile)

Последний раз редактировалось Kostia; 20.02.2011 в 23:43.
Kostia вне форума Ответить с цитированием
Старый 21.02.2011, 01:40   #4
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Цитата:
PS: WMF (англ. Windows MetaFile) — универсальный формат векторных графических файлов для Windows приложений.(http://ru.wikipedia.org/wiki/Windows_Metafile)
то есть это просто ещё один формат картинок, зачем отделять его от прочих?
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 21.02.2011 в 01:46.
Obey-Kun вне форума Ответить с цитированием
Старый 21.02.2011, 01:45   #5
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Цитата:
void MainWindow::setVectorImage(const QPixmap pmap)
void MainWindow::setVectorImage(const QPixmap &pmap) же...
вообще, по логике надо её назвать MainWindow::setPixmap(const QPixmap &pmap)

и нельзя сделать просто ui->label_5->setPixmap(pmap)?

Цитата:
ui->label_5->pixels[i][j]=...
открытых полей в qt по канонам ООП нету
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 21.02.2011 в 05:07.
Obey-Kun вне форума Ответить с цитированием
Старый 21.02.2011, 09:54   #6
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Это не моя прихоть что делят изображение на растровое и векторное и к томуже так указазано в задании. Да и еще фигня с этими слотами, чтобы повешать обработчик двойного нажатия мыши пришлось свой класс наследник делать...
И в любом случае qt не имеет возможности работать виндовыми метафайлами, а писать свой класс увольте... Это всего лишь лаба.
Kostia вне форума Ответить с цитированием
Старый 21.02.2011, 11:15   #7
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Цитата:
Сообщение от Kostia Посмотреть сообщение
Это не моя прихоть что делят изображение на растровое и векторное и к томуже так указазано в задании. Да и еще фигня с этими слотами, чтобы повешать обработчик двойного нажатия мыши пришлось свой класс наследник делать...
И в любом случае qt не имеет возможности работать виндовыми метафайлами, а писать свой класс увольте... Это всего лишь лаба.
Вы правы
Цитата:
Сообщение от Kostia Посмотреть сообщение
MetaFile в TImage2
Скорее всего придётся делать в билдере...
Изображения
Тип файла: png снимок1.png (29.9 Кб, 102 просмотров)
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 21.02.2011, 11:19   #8
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Цитата:
Да и еще фигня с этими слотами, чтобы повешать обработчик двойного нажатия мыши пришлось свой класс наследник делать...
Никакая не фигня. Это вполне нормально. ООП как он есть.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 21.02.2011 в 11:22.
Obey-Kun вне форума Ответить с цитированием
Старый 25.02.2011, 02:35   #9
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Цитата:
Да и еще фигня с этими слотами, чтобы повешать обработчик двойного нажатия мыши пришлось свой класс наследник делать...
Кстати, можно было просто написать event filter: http://wiki.metrotek.spb.ru/wiki/%D0...B5.D1.82.D0.B0

И, кстати, зачем вообще было делать свой класс? Какова структура проекта вообще?
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с графикой в С# Ksanfur Помощь студентам 1 16.04.2010 23:39
Работа с графикой! Gladiator Фриланс 6 10.03.2010 18:47
работа с графикой aiktz Помощь студентам 0 08.12.2009 17:51
Работа с графикой EdNovice Общие вопросы .NET 0 11.03.2009 11:09
Работа с графикой kminas Общие вопросы Delphi 5 21.11.2008 00:02