• 5661阅读
  • 1回复

什么错误? [复制链接]

上一主题 下一主题
离线vvvfffddd
 
只看楼主 倒序阅读 楼主  发表于: 2009-06-16
代码如下,信号与槽已在头文件定义,city.txt中存有32个城市的信息,编译通过了,但运行时出现错误如下:
Starting D:/Project/debug/Project.exe...
ASSERT failure in QVector<T>::operator[]: "index out of range", file ../QT/qt/include/QtCore/../../src/corelib/tools/qvector.h, line 335

D:/Project/debug/Project.exe exited with code 3
有什么错误啊?谢了

#include "mainwindow.h"
#include "addDialog.h"
#include <QMessageBox>
#include <QFileDialog>
#include <QFile>
#include <QTextStream>
#include <QVector>
#include <QProcess>

//软件默认载入文件
const QString defaultFileName="../save/city.txt";
//资源文件名
QString filename;
//所有载入城市的集合
QVector<QString> cities;
//与载入城市相对应的国家
QVector<QString> countries;
//与载入城市相对应的面积
QVector<float> areas;
//与载入城市相对应的人口
QVector<int> populations;
//与载入城市相对应的经度
QVector<float> longitude;
//与载入城市相对应的纬度
QVector<float> latitude;
//与载入城市相对应的城市图片
QVector<QString> pictures;
//与载入城市相对应的城市交通图
QVector<QString> maps;
//与载入城市相对应的描述
QVector<QString> descriptions;

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindowClass)
{
    ui->setupUi(this);
    filename=defaultFileName;
    initialMessage();
    //退出按钮的信号槽
    connect(ui->exit,SIGNAL(triggered()),this,SLOT(close()));
    //关于按钮的信号槽
    connect(ui->about,SIGNAL(triggered()),this,SLOT(message()));
    //打开文件按钮的信号槽
    connect(ui->open,SIGNAL(triggered()),this,SLOT(openfile()));
    //选择城市信息项目的信号槽
    connect(ui->itemComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(showDetail()));
    //选择城市的信号槽
    connect(ui->cityComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(showDetail()));
    //帮助按钮的信号槽
    connect(ui->help,SIGNAL(triggered()),this,SLOT(openhelp()));

}

MainWindow::~MainWindow()
{
    delete ui;
}

/**该槽显示出一个
  *展示团队信息的信息框
**/
void MainWindow::message()
{
    QMessageBox mb(QMessageBox::Information,tr("关于"),tr("绿叶工作室"),QMessageBox::Ok);
    mb.exec();
}

/**该槽显示文件对话框
  *并获取用户选择的文件
**/
void MainWindow::openfile()
{
    filename = QFileDialog::getOpenFileName(this,
     tr("Open file"), "/", tr("text File (*.txt)"));
    initialMessage();
}

/**此函数用于程序载入时的初始化
  *和用户载入其他资源文件时的初始化
  **/
void MainWindow::initialMessage()
{
    QFile file(filename);
     if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
         return;
     QTextStream in(&file);
     QString city, country,picture,map,description;
     int population;
     float jingdu,weidu,area;
     while (!in.atEnd()) {
         //在此读入信息
         in>>city>>country>>area>>population>>jingdu>>weidu>>picture>>map>>description;
         ui->cityComboBox->addItem(city);
         cities.push_back(city);
         countries.push_back(country);
         areas.push_back(area);
         populations.push_back(population);
         longitude.push_back(jingdu);
         latitude.push_back(weidu);
         pictures.push_back(picture);
         maps.push_back(map);
         descriptions.push_back(description);
     }
    file.close();
    /*QPixmap pixmap(pictures[0]);
    int jd = (longitude[0]+180)*600/360+10;
    int wd = (90-latitude[0])*300/180+20;
    ui->pictureLabel->setPixmap(pixmap);
    ui->messageTextEdit->setText(countries[0]);
    ui->line->move(20,wd);
    ui->line_2->move(jd,32);*/
}

/**此方法响应城市项目
  *的变换
  *显示出当前项目的详细信息
  **/
void MainWindow::showDetail()
{
    switch(ui->itemComboBox->currentIndex())
    {
        case 0:
        ui->messageTextEdit->setText(countries[ui->cityComboBox->currentIndex()]);
        break;
        case 1:
        ui->messageTextEdit->setText(QString::number(areas[ui->cityComboBox->currentIndex()]));
        break;
        case 2:
        ui->messageTextEdit->setText(QString::number(populations[ui->cityComboBox->currentIndex()]));
        break;
        case 3:
            ui->messageTextEdit->setText(QString::number(longitude[ui->cityComboBox->currentIndex()]));
        break;
        case 4:
            ui->messageTextEdit->setText(QString::number(latitude[ui->cityComboBox->currentIndex()]));
        break;
        case 5:
            ui->messageTextEdit->setText(descriptions[ui->cityComboBox->currentIndex()]);
    }
}

/**此方法响应城市变换
  *将世界地图的坐标
  *城市的地图
  *城市的图片
  *换为当前城市的信息
  **/
void MainWindow::on_cityComboBox_currentIndexChanged()
{
    int a = ui->cityComboBox->currentIndex();
    if(ui->cityComboBox->currentText().isEmpty())
    {
        ui->label->clear();
        ui->line->setVisible(false);
        ui->line_2->setVisible(false);
    }
    else
    {
        int jd = (longitude[a]+180)*600/360+10;
        int wd = (90-latitude[a])*300/180+20;
        ui->line->move(20,wd);
        ui->line_2->move(jd,32);
    }
    if(ui->pushButton->text()=="切换到城市地图")
    {
        QPixmap pixmap("../image/world_map_gif.png");
        ui->label->setPixmap(pixmap);
        ui->line->setVisible(true);
        ui->line_2->setVisible(true);
    }
    else
    {
        QPixmap pixmap(maps[a]);
        ui->label->setPixmap(pixmap);
        ui->line->setVisible(false);
        ui->line_2->setVisible(false);
    }
}

/**此方法响应城市添加按钮
  *通过弹出一个对话框
  *获得用户所需添加城市的信息
  **/
void MainWindow::on_addPushButton_clicked()
{
    addDialog addcity(this);
    addcity.exec();
}

/**此方法响应帮助选项
  *通过打开一个CHM格式的文档
  *为用户提供帮助
  **/
void MainWindow::openhelp()
{
    const QString helpPath("help.chm");
    QStringList args;
    args<<"/s"<<"help.chm";
    QProcess* myProcess=new QProcess;
    myProcess->start(helpPath,args);
}

/**此方法响应图片变换按钮
  *点击在城市地图与世界地图之间切换
  **/
void MainWindow::on_pushButton_clicked()
{
    if(ui->pushButton->text()=="切换到城市地图")
    {
        int a = ui->cityComboBox->currentIndex();
        QPixmap pixmap(maps[a]);
        ui->label->setPixmap(pixmap);
        ui->line->setVisible(false);
        ui->line_2->setVisible(false);
        ui->pushButton->setText("切换到世界地图");
    }
    else
    {
        QPixmap pixmap("../image/world_map_gif.png");
        ui->label->setPixmap(pixmap);
        ui->line->setVisible(true);
        ui->line_2->setVisible(true);
        ui->pushButton->setText("切换到城市地图");
    }
}
离线xymail110
只看该作者 1楼 发表于: 2009-06-17
不清楚,从信息来看,应该是你用QVector时出错了,你把你用到的QVector的几个文件贴出来看看。
学无止境
快速回复
限100 字节
 
上一个 下一个