LINUX.ORG.RU

QT аналог ImageList

 


0

0

Дамы и господа специалисты и гуру в QT Перевожу один немаленький проект из С++ на RadStudio в аналог в QT для Linux. Вроде всё понятно кроме одного нюанса В проекте присутствует очень много объектов класса TImageList в которые загружены куча разных картинок Вопрос, какой аналог и как использовать TImageList в среде QT ? Особенность, проект собирается посредством Makefile, а не стандартным pro файлом


Ответ на: комментарий от hobbit

я свои первые программы на турбопаскале под досом вообще по справке писал

Так у тебя справка есть!? Это многое объясняет, с этого и надо было начинать...

anonymous
()
Ответ на: комментарий от hobbit

А вот развязные претензии, которые я цитировал выше - это НЕ критика, это по-другому называется.

Qt Designer действительно несколько неинтуитивен. Особенно в плане задания всяких там иконок из QRC или внешних ресурсов. И в плане компоновки виджетов через Layout'ы. Я постоянно забывал выставлять корневому виджету или виджетам-контейнерам QVBoxLayout и у меня виджеты расползались по форме. Приходилось несколько раз лазить в книжку по Qt, чтобы вспомнить как там это всё грамотно делается.

Зато сейчас, когда я понял эту механику, компоновка виджетов с помощью этих примитивных слоёв кажется мне очень удобной, в отличие от того же Android или JavaFX, где нечто подобное, но более сложное и ещё более неинутитивное.

Ну и интерфейс работы с QRC в самом Qt Creator'е тоже не слишком понятен. Особенно начинающим. Его пару раз переделывали, но особых улучшений не привнесли. Особенно сбивает с толку дефолтное /new/prefix1 или что-то в этом роде.

Вот именно уважения я и не увидел.

Дань уважения разработчикам Qt и самому фреймворку нужно отдавать полезными программами на нём. Подходы «я не буду тебе помогать, потому что ты пишешь QT вместо Qt» или «я не буду тебе помогать потому что ты считаешь, что Qt в некоторых местах нелогичный» или «я не буду отвечать на этот вопрос, потому что ты не уважаешь Qt и его разработчиков» никак не способствуют развитию чего-либо. Напротив, они лишь подчёркивают излишнюю токсичность и общий нездоровый фанатизм тусовки разработчиков под GNU/Linux.

EXL ★★★★★
()

Ну ты и тупой :) Прям типичный программист под «Виндоус», как в худших шутках с баша.

ncuxer
()
Ответ на: комментарий от EXL

оффтоп

Уважаемый(ая) EXL, а так же Виктор, анонимус и хоббит

Дело вовсе не в Борланде , QT или какой-то VisualStudio, дело в людях, которые отвечают на разных форумах (не только этом)

Ну к примеру возьмём данную тему. То что QT не умеет работать с картинками я понял ещё неделю назад, как взялся за данный проект. Потом несколько дней просидел в гугле и вроде всё должно было быть нормально... но сложив мозаику - картинки нет. Думал что проблема в префиксах, путях регистрации и так далее... но перепробовав все варианты (писал в теме) - опять нулевой результат. Кто мог подумать, что оболочка QT вместо того чтобы матерится мне красными сообщениями в Runtime просто тихо не проглотит картинку формат которой не соответствует расширению Например во всех нормальных средах разработки (в том числе в кросплатформенном Лазарусе) попытку залить в компонент картинку неподдерживаемую оболочкой закончится матом в красной каёмке ещё на этапе дизайна. Когда я исчерпал всё возможные варианты с ресурсами, я, впервые за 7 лет после регистрации - задал вопрос гуру... и что получил в ответ

1. два человека решили помочь и помогли за что им огромное спасибо

2. ещё человек (anonymous, 5-й пост) тоже дал ссылки и отправил учить талмуды. Я хоть ничего не понял с его писанины, но сразу видно что человек пытается помочь

3. пост номер 2 - некий meliafaro . Пришёл , по умничал и ушёл и

4. наш уважаемый «хоббит», который по теме не сказал ни единого внятного слова, зато потоков сознания отрыгнул в теме аж на пол страницы.

Не зная человека залез в чужую тему и начал блестеть своим отрицательным IQ линуксоида-теоретика, пытаясь показать уважаемой форумной публике что он наделён интеллектом и является неким «продвинутым» линуксоидом.

Как я расценил человека под номером 4.... Очень просто, как дворовую шавку, которая шумит больше всех, а покусать не может. Много шума, мало толку.

Когда я задаю вопрос на техническом форуме, я всегда ожидаю конструктивного ответа от форумчан и сам на других технических форумах старасюь вникнуть в проблемы вопиющего и помочь решить проблему. НО, когда на техническом форуме приходит какое то невоспитанное чмо и начинает как та шавка чавкать в мою сторону показывая свою значимость, соответственно и я переключаюсь в режим «зацедить с ноги шавке чтобы юкеой умылась». Вот и все прироги. Извиняюсь перед публикой за оффтоп

uuof
() автор топика
Ответ на: оффтоп от uuof

попытку залить в компонент картинку неподдерживаемую оболочкой закончится матом в красной каёмке ещё на этапе дизайна

Лично у меня при попытке посмотреть что там за изображение такое, Qt Creator ругается матом. Это уже наводит на мысль что с изображением что-то не так.

http://esxi.z-lab.me:666/~exl_lab/screens/qt_creator_wrong_file.png

QRC ведь просто контейнер, не обязательно для изображений. В него можно помещать любые файлы, он никак не обязан их проверять.

То что QT не умеет работать с картинками я понял ещё неделю назад, как взялся за данный проект.

На мой взгляд, основная вина лежит на том, кто создал такие картинки, в которых расширение не совпадает с их содержимым. То бишь виноват предыдущий разработчик или его инструментарий.

Но вы правы и к Qt здесь имеется претензия тоже, причём она достаточно серьёзная. Если копнуть вашу проблему глубже, то оказывается, что документация Qt по классу QPixmap попросту врёт. Она говорит, что если формат изображения не задан явно, то загрузчик пытается определить его по заголовку файла:

http://doc.qt.io/qt-5/qpixmap.html#load

Что конечно же, не так. Ведь в таком случае у вас бы всё работало. Формат файла определяется по расширению изображения.

На официальном форуме Qt человек столкнулся примерно с такой же проблемой как у вас и он тоже не понимает, почему Qt действует не согласно своей документации:

https://forum.qt.io/topic/73912/qpixmap-load-has-wrong-about-the-image-data

Разработчик Qt отвечает ему, что в документации имеется ошибка. И вот прошло почти два года, а её так никто и не исправил. Это печально. Если есть время, можете составить баг-репорт на документацию здесь https://bugreports.qt.io/

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: оффтоп от uuof

Ах да, касательно загрузки, Pixmap ведь можно проверять. То бишь что-то вроде:

QPixmap pix;
if (pix.load(QString(":/icons/%1.png").arg(10))) {
     ui->label1->setPixmap(QPixmap(QString(":/icons/%1.png").arg(10)));
} else {
     qCritical() << "Error!";
}

При этом, если явно определить BMP-формат у PNG-файла,

if (!pix.load(QString(":/icons/%1.png").arg(10), "bmp")) {

То оно будет работать и не будет материться.

Но действительно, проблема в том, что если вы используете явно вызываемый конструктор, то Qt не ругается, если у него не получилось загрузить изображение.

https://github.com/qt/qtbase/blob/e365993b72d64db441f3940d6c255e3dbb2ad76a/sr...

Хотя он легко мог бы это сделать, проверив результат возвращаемого значения метода load().

EXL ★★★★★
()
Ответ на: комментарий от EXL

А почему не так?

class myPixmaps
{
    public:
        enum PixmapName {
            Foo,
            Bar,
            BazzFromOther
        };
    public:
        myPixmaps()
        {
            m_pixmapsList
                << ":/icons/foo.png"
                << ":/icons/bar.png"
                << ":/other-icons/bazz.png";
        };
        QPixmap get(const myPixmaps::PixmapName pixmapName)
        {
            QPixmap pixmap;

            if (!pixmap.load(m_pixmapsList.at(pixmapName)) {
                qCritical() << "Ой!";
            }

            return pixmap;
        }
    private:
        QStringList m_pixmapsList;
}

Влепить его экстерном и дергать:

objWithBarPixmap->setPixmap(myPixmaps.get(myPixmaps::Bar));

Чем будет плохо так?

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Чем будет плохо так?

Тут как самому удобно так и можно реализовать. Смысл в том, что load() возвращает значение, а Qt в явном конструкторе его почему-то не проверяет. Единственное, в твоём примере выше неудобно будет при добавлении иконки в двух местах код дописывать. Наверное в этом плане проще будет использовать какой-нибудь QHash.

EXL ★★★★★
()
Ответ на: комментарий от EXL

Ну первые два варианта ты сам придумал, а третий

«я не буду отвечать на этот вопрос, потому что ты не уважаешь Qt и его разработчиков»

вот да, описывает то, что я пытаюсь тебе объяснить. Вижу, что зря. Извиняй, конечно, но если я бы я начал задавать вопросы по GTK, к примеру (которую я знаю очень плохо), я бы не стал брызгать слюнями про «байтодрочерство», «ненужные талмуды», которые я не хочу читать и др. А если б я себе такое позволил, то вполне логично, что кто-нибудь попросил бы меня умерить тон.

hobbit ★★★★★
()
Ответ на: Эмбаркадеро от uuof

а это уже вопрос к заказчикам из РФ, зачем они после 2014 года так массового и истерически переходят из Windows на LINUX... наверное боятся чтобы дядя Билл не отключил их Винду одной кнопкой с пиндостана =))

Город: Киев

он ещё и зрадник

Harald ★★★★★
()
Ответ на: комментарий от EXL

Если копнуть вашу проблему глубже, то оказывается, что документация Qt по классу QPixmap попросту врёт. Она говорит, что если формат изображения не задан явно, то загрузчик пытается определить его по заголовку файла

Я, кстати, сталкивался и с более серьёзной проблемой. Если на вход QPixmap подавать сильно битые JPEG-файлы, то в особо тяжёлом случае программа может просто упасть (в заголовке JPEG есть таблицы смещений, и прочитанные смещения, видимо, не всегда проверяются на корректность). Я не уверен, что это проблема именно Qt, поскольку проверка всего, что там в заголовке написано, может серьёзно повлиять на производительность. Но проблема такая есть, по крайней мере, в Qt4 была (современную не проверял).

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от EXL

EXL

На мой взгляд, основная вина лежит на том, кто создал такие картинки, в которых расширение не совпадает с их содержимым. То бишь виноват предыдущий разработчик или его инструментарий.

Не поверите, предыдущий разработчик и его инструментарий это Я и Embrercadero. А файлы я тупо выгрузил прямо из TImageList в оболочке RadStudio10.2 и почему то, она мне сформировала 206 вот таких картинок, с BMP-шной начинкой и PNG-шным расширением. Самое интересное, что RadStudio , Borland C++ (старый), Delphi 7 и даже VisualStudio 2015-я нормально «подхватывают» эти картинки в свои компоненты.... а QT тихо глючит =)

uuof
() автор топика
Ответ на: комментарий от hobbit

Ну первые два варианта ты сам придумал

Просто ты опять перенял эти варианты на свой счёт. А я про ситуацию на форуме в целом. Тут практически в каждой теме c «QT» начинается тупо глумление и петросянство.

Вижу, что зря. Извиняй, конечно, но если я бы я начал задавать вопросы по GTK, к примеру (которую я знаю очень плохо), я бы не стал брызгать слюнями про «байтодрочерство», «ненужные талмуды», которые я не хочу читать и др. А если б я себе такое позволил, то вполне логично, что кто-нибудь попросил бы меня умерить тон.

Я понял твою точку зрения, но не разделяю её. У нас здесь всё же неформальное общение, а не какие-нибудь Qt Mailing Lists, где существует определённая этика. И если туда пришёл с вопросом, то будь добр оставь своё недовольство при себе, либо преобразуй его в конструктивную критику. Повторюсь, я не увидел хамства. Агрессия, недовольство и уже впоследствии реакции пользователей драма с переходами на личности. Тут уж пусть решают модераторы.

EXL ★★★★★
()
Ответ на: EXL от uuof

она мне сформировала 206 вот таких картинок, с BMP-шной начинкой и PNG-шным расширением.

Это серьёзный недочёт, видишь во что всё вылилось. Непонятно зачем такое было сделано. Возможно IDE таким образом обходила какие-то ограничения на загрузку PNG.

Самое интересное, что RadStudio , Borland C++ (старый), Delphi 7 и даже VisualStudio 2015-я нормально «подхватывают» эти картинки в свои компоненты...

Скорее всего это заслуга GDI или что там рядом с WinAPI, который определяет тип загружаемого изображения по его заголовку, а не расширению, которое может быть неверным.

а QT тихо глючит =)

Можно составить две претензии:

1. Почему документация Qt не соответствует действительности? Либо пусть они поправят предложение там, либо исправят код, чтобы подобные случаи работали.

2. Почему в явно вызываемом конструкторе возвращаемое значение метода load() никак не обрабатывается, хотя должно. Именно из-за этого Qt «тихо глючит».

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

EXL

Уважаемый(ая) EXL Подскажите пожалуйста, как рисовать в отдельной ячейке QTableWidget как на холсте.

Что у меня есть на данный момент

   QPixmap * pixmap = 0;
   QPainter * paint = 0;
   // рисую палку
            pixmap = new QPixmap(24,24);
            paint = new QPainter();
            paint->begin(pixmap);
            paint->setPen(QPen(QColor(255, 122, 88, 255), 2));
            paint->drawLine(pixmap->rect());
            paint->end();

     // вклиниваю её в ячейку вот так
     if (pixmap)
     {
       QLabel * label  = new QLabel;
       label->setPixmap(*pixmap);
       qtable->setCellWidget (1, 3, label);
//где QTableWidget qtable
     }

В итоге, через вклинивание QLabel получаю какое то месиво непонятное... но самое важное что что-то рисуется =))

https://c.radikal.ru/c31/1802/a3/13f1c8081941.png

uuof
() автор топика
Ответ на: комментарий от anonymous

Он же хоббит, дайте ему эти jpeg bmp, пусть идет к winapi и кинет их в gdi+.

anonymous
()
Ответ на: EXL от uuof

Наверное, проще всего это сделать через наследование и перегрузку метода у QLabel.

http://esxi.z-lab.me:666/~exl_lab/software/qmenu_test_to_lor.zip

QTableWidget

Вы должны быть в курсе, что этот виджет не годится если у вас большая таблица, состоящая из более чем ста значений. Следует использовать QTableView и паттерн Model/View.

http://doc.qt.io/archives/qt-4.8/model-view-programming.html

EXL ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.