Ответ в теме: Парсер сайта на Qt, использование QRegExp

      Комментарии к записи Ответ в теме: Парсер сайта на Qt, использование QRegExp отключены
#3034

И так, наш парсер выполняет разбор страницы и результат (список иконок) передает подписчикам при помощи сигнала. Теперь нам надо создать подписчика, который будет помещать иконки в виде изображений на виджет. Для этого добавим в проект файл формы (.ui):
add_ui_file_qt
Выберем шаблон формы (в виде виджета):
select_form_type
Зададим имя класса формы:
set_class_file_name_qt
Откроем форму в редакторе Qt Creator и добавим на нее QListWidget, установим имя объекта формы, например listWidget:
add-widget-on-form-qt

Чтобы наш QListWidget занимал всю площадь формы, нужно добавить компоновщик, в редакторе форм Qt Creator для этого достаточно щелкнуть на форму правой кнопкой мыши и выбрать Компоновка->по сетке (на сомом деле, в нашем случае подойдет любой вид компоновщика).

Итак, у нас в проект была добавлена форма (.ui-файл) и класс формы (размещенный в .cpp и .h файлах). В третьей части статьи Собственные виджеты в Qt Designer более подробно описано как можно использовать созданную нами форму.

Картинки, которые мы хотим отображать на виджете находятся не на нем компьютере, а на удаленном сервере — поэтому для их отображения используем PixmapLoader (см. Получить изображение с сайта средствами Qt). Объект типа PixmapLoader добавим в класс формы, а также поместим туда слот-обработчик сигнала загрузки картинки и слот-обработчик сигнала finished от нашего парсера (метод setIcons):

// gallery.h
#ifndef GALLERY_H
#define GALLERY_H

#include <QWidget>
#include "datastructures.h"
#include "pixmaploader.h"

namespace Ui {
    class Gallery;
}

class Gallery : public QWidget {
    Q_OBJECT
public:
    explicit Gallery(QWidget *parent = 0);
    ~Gallery();
private slots:
    void onPixmap_load(QPixmap);
public slots:
    void setIcons(QList<site_parser::IconData>);
private:
    Ui::Gallery *ui;
    PixmapLoader m_pixmapLoader;
};

#endif // GALLERY_H

В конструкторе класса формы нужно установить для объекта listWidget свойство IconMode и размер иконок, это нужно чтобы отображать картинки на QListWidget. Кроме того, нам нужно соединиться со слотом PixmapLoader:

Gallery::Gallery(QWidget *parent) : QWidget(parent), ui(new Ui::Gallery) {
    ui->setupUi(this);
    ui->listWidget->setViewMode(QListView::IconMode);
    ui->listWidget->setIconSize(QSize(186, 186));
    connect(&m_pixmapLoader, SIGNAL(loaded(QPixmap)),
            this, SLOT(onPixmap_load(QPixmap)));
}

В функции setIcons нужно инициализировать загрузку картинок с помощью PixmapLoader:

void Gallery::setIcons(QList<site_parser::IconData> icons) {
    for(auto const &iconData : icons) {
        m_pixmapLoader.load("https://" + iconData.urlIconSrc);
    }
}

А в слоте-обработчике загрузки картинки — добавлять картинку на QListWidget:

void Gallery::onPixmap_load(QPixmap pixmap) {
    QIcon icon(pixmap);
    QListWidgetItem *item = new QListWidgetItem(icon, "", ui->listWidget, 0);

    ui->listWidget->addItem(item);
}

Все, что нам остается сделать — создать в файле main.cpp объекты галереи и парсера и соединить их с помощью механизма сигналов и слотов:

#include <QApplication>

#include "iconspagehandler.h"
#include "gallery.h"

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    Gallery w;
    IconsPageHandler iconsPageHandler;

    w.connect(&iconsPageHandler, SIGNAL(finished(QList<site_parser::IconData>)),
              &w, SLOT(setIcons(QList<site_parser::IconData>)));

    w.show();
    iconsPageHandler.parse("https://www.goodfon.ru/catalog/girls/");

    return a.exec();
}

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