所以这就是我正在做的事情。我有这个软件,我正在使用一个主窗口,以及一个启动以下managaAttributesDialog Dialog类的动作。当对话框打开时,我对数据库执行一个查询并创建一个名为EAVFittmentProperties的自定义数据类型对象的列表,它只包含一些方法来获取和设置数据库索引的int和int属性以及一个保存的QString与该索引关联的名称。一切似乎工作正常,直到我调用setUpgGui,将那些EAVFittmentPropeties转换为可以保存可用值的组合框。这是一个make model年份搜索系统,因此我可以存储和检索任何给定车辆的油漆颜色,因此EAVFitmentProperties现在可以保存3个值;制作,模型和年份。这些组合框将在其列表中提供可用的制作模型和年份。一旦我调用setUpGui函数并开始迭代列表来创建组合框,它似乎跳过第一个值,只创建模型和年份框。
我对列表中第一项发生的事情感到很困惑,所以我有很多Debug语句,甚至在调用setUpGui函数之前运行相同的迭代,一切正常。任何人都可以提供任何见解,或者知道发生了什么?如果有更多信息我可以提供请问,这让我发疯,我很想知道发生了什么。先谢谢你们!
#include "manageattributesdialog.h"
#include "eavfittmentproperties.h"
#include <QtWidgets>
#include <QtSql>
ManageAttributesDialog::ManageAttributesDialog(QWidget *parent) :
QDialog(parent)
{
QSqlDatabase localdb = QSqlDatabase::database("");
if(localdb.open())
{
QMessageBox::information(this,"Connected","Connection to the Database was Established\n"
"\nStatus: Connected");
QSqlQuery *qry = new QSqlQuery(localdb);
if(qry->exec("SELECT * FROM [ProductHelper].[dbo].[EAV_FittmentProperties]"))
{
int z = 1;
while(qry->next())
{
z++;
qDebug() << qry->value(0).toString();
qDebug() << qry->value(1).toString();
int mX = qry->value(0).toInt();
EAVFittmentProperties *fitmentPropertyOption = new EAVFittmentProperties(this);
fitmentPropertyOption->setIndexID(qry->value(0).toInt());
fitmentPropertyOption->setName(qry->value(1).toString());
fitmentPropertiesList.append(fitmentPropertyOption);
}
qry->finish();
}
else
{
QMessageBox::information(this,"Database Query Failed","Query to the Database could not be completed\n"
"\nStatus: Query Not Completed\nError: " + localdb.lastError().text());
}
localdb.close();
for(int i = 0; i < fitmentPropertiesList.count(); i++)
{
qDebug() << i << " is the number we are on";
qDebug() << fitmentPropertiesList[i]->getIndexID();
qDebug() << fitmentPropertiesList[i]->getName();
}
}
else
{
QMessageBox::information(this,"Not Connected","Connection to the Database could not be Established\n"
"\nStatus: Not Connected\nError: " + localdb.lastError().text());
}
setUpGui();
}
void ManageAttributesDialog::setUpGui()
{
//QFrame *mFrame = new QFrame(this);
QVBoxLayout *mLayout = new QVBoxLayout();
QLabel fitmentHeadingLbl;
fitmentHeadingLbl.setText(tr("Fitment Options"));
mLayout->addWidget(&fitmentHeadingLbl);
fitmentPropertiesList.begin();
qDebug() << fitmentPropertiesList.count();
for(int j = 0; j < fitmentPropertiesList.count(); j++)
{
qDebug() << j << " is the number we are on";
qDebug() << fitmentPropertiesList[j]->getIndexID();
int sInt = fitmentPropertiesList[j]->getIndexID();
qDebug() << fitmentPropertiesList[j]->getName();
QString sString = fitmentPropertiesList[j]->getName().toLatin1();
qDebug() << sInt;
qDebug() << sString;
fitmentPropertyLayout[j] = new QVBoxLayout();
QVBoxLayout *thisLayout = fitmentPropertyLayout[j];
fitmentPropertyLabel[j] = new QLabel();
QString sString = fitmentPropertiesList[j]->getName().toLatin1();
qDebug() << sString;
fitmentPropertyLabel[j]->setText(sString);
fitmentPropertyCombo[j] = new QComboBox();
thisLayout->addWidget(fitmentPropertyLabel[j]);
thisLayout->addWidget(fitmentPropertyCombo[j]);
//mLayout->addLayout(thisLayout);
}
//mFrame->setLayout(mLayout);
this->setMinimumSize(400,400);
this->setLayout(mLayout);
}
答案 0 :(得分:2)
不使用QSqlQuery,我只看了这个页面:http://qt-project.org/doc/qt-4.8/qsqlquery.html
根据该页面,您应该在进入循环之前使用first()函数,并以这种方式重写循环:
bool bKeepLooping = qry->first();
while( keepLooping )
{
// do stuff with the query
// get next item at the bottom of the loop
keepLooping = qry->next();
}
我不是Qt专家。我只是阅读文档并就我认为的问题提出建议。在列表中获取“第一”和“下一个”项目的大多数迭代方法都是以这种方式完成的(读取目录中的文件,获取结果集中的项目等)。