Как я могу добавить множество виджетов в несколько сеток в QT
У меня есть таблица в базе данных MySQl, которая состоит из типа категории продукта, подкатегории, picUrl и цены. Я хотел бы добавить каждую запись к нескольким виджетам QGridLayout, которые я создал для пользовательского интерфейса и назначил QScrollAreas для разных категорий и подкатегорий.
Он прекрасно работает для 100 элементов или небольшого числа, но если я установлю для элементов LIMIT значение LIMIT 1000 или что-то намного большее, чем 100 .. он начнет создавать QThread::start: Не удалось создать thread() Неверный параметр, переданный в C функция времени выполнения. ошибки. QThread::start: Не удалось создать поток (Код доступа недействителен.)
И иногда я получаю много QPixmap::scaled: Pixmap - это нулевое растровое изображение, но мой слот обновляет изображение после получения QNetworkReply, поэтому он загружается в свое время.
Это из-за слишком большого количества созданных классов, есть ли способ замедлить создание и добавление в мои сетки, если это так, поэтому я могу просмотреть их все? Или я должен перепроектировать и создать страницы из 100 элементов и / или показать страницу только 1 категории вместо TabWidget со всем?...
Я действительно хочу, чтобы в мои Gridlayouts было вставлено любое количество виджетов.
Вот код, который я использую.
void checkNewArrivals::addAllItems(){
QString sql = "SELECT Category, SubCategory, picUrl, usPrice FROM newproducts LIMIT 1000";
QSqlQuery query(this->db);
query.exec(sql);
while (query.next()){
QString category = query.value(0).toString();
QString subCategory = query.value(1).toString();
QString picUrl = query.value(2).toString();
QString usPrice = query.value(3).toString();
addItem("id", picUrl, usPrice, category, subCategory);
}
}
Функция addItem
void checkNewArrivals::addItem(QString id, QString picUrl, QString price, QString category, QString subCategory){
if (category == "Autumn-Spring"){
if (subCategory == "Dress"){
addToGrid(ui->autumnSpringDressLayout, id, picUrl, price);
}else if (subCategory == "Blouse"){
addToGrid(ui->autumnSpringBlouseLayout, id, picUrl, price);
} else if (subCategory == "Long Coat"){
addToGrid(ui->autumnSpringLongCoatLayout, id, picUrl, price);
} else if (subCategory == "Short Coat"){
addToGrid(ui->autumnSpringShortCoatLayout, id, picUrl, price);
} else if (subCategory == "Sweater"){
addToGrid(ui->autumnSpringSweaterLayout, id, picUrl, price);
} else if (subCategory == "Skirt Pants"){
addToGrid(ui->autumnSpringSkirtPantsLayout, id, picUrl, price);
} else if (subCategory == "Sportsuit"){
addToGrid(ui->autumnSpringSportsuitLayout, id, picUrl, price);
} else if (subCategory == "Vest Bustier"){
addToGrid(ui->autumnSpringVestBustierLayout, id, picUrl, price);
}
}
}
функция для добавления в сетку
void checkNewArrivals::addToGrid(QGridLayout *layout, QString id, QString picUrl, QString usPrice){
checkNewArrivalItem *item = new checkNewArrivalItem;
item->setupItem(id, picUrl, usPrice);
int row = (layout->count() / 4);
int col = (layout->count() % 4);
layout->addWidget(item, row, col);
qDebug() << "Item Added to Grid: Row: " << row << " Col: " << col << endl;
}
и мой заголовок класса checkNewArrivalitem
#ifndef CHECKNEWARRIVALITEM_H
#define CHECKNEWARRIVALITEM_H
#include <QWidget>
#include "filedownloader.h"
#include <QGridLayout>
namespace Ui {
class checkNewArrivalItem;
}
class checkNewArrivalItem : public QWidget
{
Q_OBJECT
public:
explicit checkNewArrivalItem(QWidget *parent = 0);
~checkNewArrivalItem();
void setupItem(QString id, QString picUrl, QString usPrice);
FileDownloader *m_pImgCtrl;
QString id, picUrl, usPrice;
QGridLayout *layout;
private slots:
void loadImage();
private:
Ui::checkNewArrivalItem *ui;
};
#endif // CHECKNEWARRIVALITEM_H
и класс checkNewArrivalItem cpp
#include "checknewarrivalitem.h"
#include "ui_checknewarrivalitem.h"
checkNewArrivalItem::checkNewArrivalItem(QWidget *parent) :
QWidget(parent),
ui(new Ui::checkNewArrivalItem)
{
ui->setupUi(this);
}
checkNewArrivalItem::~checkNewArrivalItem()
{
delete ui;
}
void checkNewArrivalItem::setupItem(QString id, QString picUrl, QString usPrice){
ui->itemGroupBox->setTitle("ID: " + id);
ui->priceLabel->setText("US $" + usPrice);
m_pImgCtrl = new FileDownloader(QUrl(picUrl), this);
connect(m_pImgCtrl, SIGNAL(downloaded()), SLOT(loadImage()));
this->setMinimumHeight(267);
}
void checkNewArrivalItem::loadImage(){
QPixmap *buttonImage = new QPixmap;
if (!m_pImgCtrl->downloadedData().isNull()){
buttonImage->loadFromData(m_pImgCtrl->downloadedData());
int h = ui->photoLabel->height();
int w = ui->photoLabel->width();
ui->photoLabel->setPixmap(buttonImage->scaled(w, h, Qt::KeepAspectRatio, Qt::SmoothTransformation));
}
}
1 ответ
То, что вы пытаетесь сделать, не очень хороший путь. Даже если вы устраните эту ошибку - потребление ресурсов процессора и памяти будет очень большим, и хуже всего то, что пользователь обычно не может сконцентрироваться или даже увидеть 1000 элементов одновременно, поэтому в большинстве случаев это действительно не нужно (это одна из причин, почему вы не видите настройки движка форума для отображения последних 10000 ответов).
Вы должны объединить MySql's LIMIT offset, number_of_items
чтобы разбить окно на страницы (и не забудьте предоставить пользователю удобный механизм разбиения на страницы).