【求助】vs2008+Qt4.8.4,更新Widget内容时发生访问冲突

frankfzw 上海交通大学 学生  2013-02-19 12:13:36
本人刚学Qt不久,遇到一个让我头疼了好多天的问题
我打算把我从后台获取的数据刷到构建好的Wdiget上,结果总是在最后发生访问冲突的问题。令我百思不得其解的是如果我在刷新函数里头新建一个数据,却能正常的更新内容。一下是代码部分,还请各位高手多多指教。
MainWindow::MainWindow(QWidget *parent, Qt::WFlags flags)
: QWidget(parent, flags)
{
ui.setupUi(this);
...
for(int i = 0; i < ITEM_PER_PAGE; i++) //在这里添加自己的Widget控件
{
ItemWidget *itemWidget = new ItemWidget();
QPushButton *buyButton = new QPushButton(itemWidget);
buyButton->setText("Buy!");
buyButton->setGeometry(950, 100, 60, 30);
ui.gridLayoutPro->addWidget(itemWidget, i, 0);
connect(buyButton, SIGNAL(clicked()), itemWidget, SLOT(setMessage()));
connect(itemWidget, SIGNAL(sendMessage(string, int)), this, SLOT(buyItem(string, int)));
itemWidget->show();
itemWidgets.push_back(itemWidget);
buyButtons.push_back(buyButton);
}

...
}

void MainWindow::showItem(int category, int pageNum)
{

vector<Product> products; //用来保存我从后台取得的结果的vector,后台的代码单独测试过 没问题
...
for(int i = products.size(); i < ITEM_PER_PAGE; i++)//将不用的控件隐藏起来
{
itemWidgets[i]->clearMessage();
itemWidgets[i]->hide();
}
Product tempPro;
tempPro.about = "aaa";
tempPro.address = "bbb";
tempPro.category = 2;
tempPro.ID = "ddd";
tempPro.price = 235;
tempPro.quantity = 23554;
for(int i = 0; i < products.size(); i++)
{
itemWidgets[i]->init(products[i]); //奇怪的就是在这里,如果这么写,最后就崩溃了
//itemWidgets[i]->init(tempPro); //但是换成这句话,最后却没有任何问题
itemWidgets[i]->show();
}
}

void ItemWidget::init(const Product &product) //这是控件的init函数,不知道哪里写的不对了
{
QString const &qName = QString::fromLocal8Bit(product.name.c_str());
ui.name->setText(qName);

switch(product.category)
{
case 1:
ui.category->setText("Book");
ui.pic->setPixmap(QPixmap("book.png"));
break;
case 2:
...
case 3:
...
case 4:
...
case 5:
...
default:
...
}

QString qAbout = QString::fromLocal8Bit(product.about.c_str());
//insert '\n'
for(int i = ABOUT_LABEL_LEN; i < qAbout.size(); i += ABOUT_LABEL_LEN)
{
qAbout.insert(i, '\n');
}
QString const &qLabelAbout = qAbout;
ui.about->setText(qLabelAbout);

QString const &qAddress = QString::fromLocal8Bit(product.address.c_str());
ui.address->setText(qAddress);

string price, sQuantity;
char temp[10];
sprintf(temp, "%f", product.price);
price = temp;
sprintf(temp, "%d", product.quantity);
sQuantity = temp;
QString const &qPrice = QString::fromLocal8Bit(price.c_str());
QString const &qQuantity = QString::fromLocal8Bit(sQuantity.c_str());
ui.price->setText(qPrice);
ui.quantity->setText(qQuantity);
ui.spinBox->setMaximum(product.quantity);

itemKey = product.name;
quantity = product.quantity;

QMessageBox::warning(this, "Message", qName, QMessageBox::Ok);
}//出错的时候都是执行到这里,然后就跳到内部的代码里,在析构QString的时候出错了。
...全文
56 3 点赞 打赏 收藏 举报
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
frankfzw 2013-02-20
我设置过断点,但崩溃的时候已经不再我自己写的代码里了,堆栈的话好像是一个qt的dll。不过现在这个问题没了……我把ItemWidget写到一个独立的cpp里就好了……囧
  • 打赏
  • 举报
回复
dext 2013-02-19
其实只要加一个断点,看看崩溃的时候 i 是 多少就行了。
  • 打赏
  • 举报
回复
应该是你的products的问题 你调试运行 出错后看看堆栈就知道代码崩在哪句了
  • 打赏
  • 举报
回复
相关推荐
发帖
Qt
加入

1.3w+

社区成员

Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
申请成为版主
帖子事件
创建了帖子
2013-02-19 12:13
社区公告
暂无公告