代码如下,信号与槽已在头文件定义,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("切换到城市地图");
}
}