当前位置:编程学习 > wap >>

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

本人刚学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的时候出错了。 qt --------------------编程问答-------------------- 其实只要加一个断点,看看崩溃的时候  i 是 多少就行了。 --------------------编程问答-------------------- 应该是你的products的问题  你调试运行 出错后看看堆栈就知道代码崩在哪句了 --------------------编程问答-------------------- 我设置过断点,但崩溃的时候已经不再我自己写的代码里了,堆栈的话好像是一个qt的dll。不过现在这个问题没了……我把ItemWidget写到一个独立的cpp里就好了……囧
补充:移动开发 ,  Qt
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,