1

製品カテゴリ タイプ、サブカテゴリ、picUrl、および価格で構成される MySQl データベースにテーブルがあります。各レコードを複数の QGridLayout ウィジェットに追加して、Ui を作成し、さまざまなカテゴリとサブカテゴリの QScrollAreas に割り当てたいと思います。

100 個のアイテムまたは少数のアイテムに対しては正常に動作しますが、LIMIT アイテムを LIMIT 1000 または 100 をはるかに超える値に設定すると、QThread::start: Failed to create thread() Invalid parameter passed to C が生成され始めます。ランタイム機能。エラー。QThread::start: スレッドの作成に失敗しました (アクセスコードが無効です。)

そして、私は時々たくさんの QPixmap::scaled: Pixmap is a null pixmap を取得しますが、私のスロットは QNetworkReply が受信された後に画像を更新するので、独自の時間にロードされます。

これは、クラスの作成が多すぎるためですか? その場合、作成を遅くしてグリッドレイアウトに追加する方法はありますか? または、再設計して 100 項目のページを作成するか、すべてを含む TabWidget の代わりに 1 つのカテゴリのみのページを表示する必要がありますか? ...

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));
    }
}
4

1 に答える 1

2

あなたがやろうとしていることは、あまり良い方法ではありません。このエラーを解決したとしても、CPU とメモリの消費量が非常に大きくなり、最悪の場合、ユーザーは通常、集中できなかったり、一度に 1000 個のアイテムを表示することさえできなかったりするため、ほとんどの場合、必要ありません (これは、最新の 10000 件の返信を表示するフォーラム エンジンのセットアップが表示されない理由の一部です)。

MySql を組み合わせLIMIT offset, number_of_itemsてウィンドウのページ付けを行う必要があります (ユーザーに快適なページ付けメカニズムを提供することを忘れないでください)。

于 2013-02-05T16:37:33.133 に答える