【发布时间】:2013-02-05 15:52:58
【问题描述】:
我在 MySQl 数据库中有一个表,它由产品类别类型、子类别、picUrl 和价格组成。我想将每条记录添加到多个 QGridLayout Widget,我已经制作了 Ui 并分配给 QScrollAreas 以用于不同的类别和子类别。
它适用于 100 个项目或少量项目,但如果我将 LIMIT 项目设置为 LIMIT 1000 或任何大于 100 的项目 .. 它开始产生 QThread::start: 未能创建线程() 传递给 C 运行时函数的参数无效。错误。 QThread::start: 创建线程失败(访问码无效)
有时我会得到很多 QPixmap::scaled: Pixmap is a null 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));
}
}
【问题讨论】:
-
我不能回答你,因为它很难复制,但我可以肯定地告诉你,分页是更好的方法,然后显示 1000 个小部件(无论如何用户都看不到这些小部件) )。
-
我可能会咬紧牙关,除非其他人可以说服我否则,这将是一个糟糕的设计,试图将数千张图像加载到几个布局中。我将使用带有 sql 限制的偏移量重新设计和创建下一页,以减少每个布局的小部件数量。
-
@Nemanja Boric。您好,感谢您的答复。我只是写了我的回复,没有看你写的东西,你是说我刚才说的仪式吗?创建偏移量和限制?
-
是的-这是创建分页的好方法-使用MySql的
LIMIT offset, number创建页面,并允许用户浏览页面。 -
谢谢,我该如何接受您的建议作为答案?
标签: qt qgridlayout