QList正在跳过列表中的第一项,为什么?

时间:2014-04-04 17:24:51

标签: c++ qt qlist

所以这就是我正在做的事情。我有这个软件,我正在使用一个主窗口,以及一个启动以下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);
}

1 个答案:

答案 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专家。我只是阅读文档并就我认为的问题提出建议。在列表中获取“第一”和“下一个”项目的大多数迭代方法都是以这种方式完成的(读取目录中的文件,获取结果集中的项目等)。