PDA

View Full Version : The program has unexpectedly finished.



smemamian
31st March 2013, 18:00
hi everybody

When I click on the "Click me" button , I get the message :


The program has unexpectedly finished.

Then program is closed !

8871

why ?!


#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QString>
#include <QMainWindow>
#include <QtCore>
#include <QtGui>
#include <QTreeWidget>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT
void addRoot(QString name,QString dec);
void addChild(QTreeWidgetItem *parent,QString name,QString dec);
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();


private slots:
void on_pushButton_clicked();

private:
Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTreeWidget>
#include <QFont>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->treeWidget->setColumnCount(2);
addRoot("Hello","World");
}

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

void MainWindow::addRoot(QString name,QString dec)
{
QTreeWidgetItem *ptr = new QTreeWidgetItem(ui->treeWidget) ;
ptr->setText(0,name);
ptr->setText(1,dec);
addChild(ptr,name,dec);
}
void MainWindow::addChild(QTreeWidgetItem *parent,QString name,QString dec)
{
QTreeWidgetItem *ptr1 = new QTreeWidgetItem;
ptr1->setText(0,name);
ptr1->setText(1,dec);
parent->addChild(ptr1);
}

void MainWindow::on_pushButton_clicked()
{
QTreeWidgetItem *ptr = ui->treeWidget->currentItem();

for(int i=0 ; i<100 ;i++)
{
ui->progressBar->setValue(i);
QThread::msleep(2);
}
if(ptr->isSelected())
{
ptr->setBackgroundColor(0,Qt::red);
ptr->setBackgroundColor(1,Qt::red);
}
}

Guiom
31st March 2013, 19:12
If you click in the button and no items are selected, ui->treeWidget->currentItem() return NULL.
And when the line ptr->isSelected() is executed, your program crash...
You need to add robustness.

smemamian
31st March 2013, 19:43
is it true ? :-?


void MainWindow::on_pushButton_clicked()
{


for(int i=0 ; i<100 ;i++)
{
ui->progressBar->setValue(i);
QThread::msleep(2);
}
if(ui->treeWidget->currentItem()->isSelected())
{
QTreeWidgetItem *ptr = ui->treeWidget->currentItem();
ptr->setBackgroundColor(0,Qt::red);
ptr->setBackgroundColor(1,Qt::red);
}
}

Guiom
31st March 2013, 20:03
Nop, rather:



void MainWindow::on_pushButton_clicked()
{
QTreeWidgetItem *ptr = ui->treeWidget->currentItem();

for(int i=0 ; i<100 ;i++)
{
ui->progressBar->setValue(i);
QThread::msleep(2);
}
if(ptr && ptr->isSelected())
{
ptr->setBackgroundColor(0,Qt::red);
ptr->setBackgroundColor(1,Qt::red);
}
}


or use selectedItems().cout() ...

ChrisW67
1st April 2013, 00:44
Seems a rather pointless progress bar. Empty to full in 100 steps over 200 milliseconds... and then do the 'work' in fractions of a millisecond?