2012-03-01 83 views
1

我爲Qt中的練習製作了以下程序。當我單擊Listwidget中的項目時,我的程序崩潰,以便該項目的行號成爲Listwidget_2中的項目。這是代碼。 MainWindow.h與Qt IDE生成的相同(不做任何更改,所有函數都是預定義的,已經在.cpp文件中使用過)。如果我在程序中發現內存泄漏,請通知我,因爲我是初學者。Qt程序錯誤

感謝您的幫助!

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

#include <QMessageBox> 
#include <QTextStream> 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    noofitems=0; 
    files.setFileName("E:/filev.txt"); 
} 

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

void MainWindow::on_actionDelete_Item_triggered() 
{ 

     qDeleteAll(ui->listWidget->selectedItems()); 
} 

void MainWindow::on_okbutton_clicked() 
{ 
    QListWidgetItem *item=new QListWidgetItem; 

    item->setText(ui->lineEdit->text()); 
    ui->listWidget->addItem(item); 
    noofitems++; 

    writefile(); 
} 

void MainWindow::writefile() 
{ 
    QFile files("E:/legitfile.txt"); 

    if(files.exists()) 
    { 
     if(!files.open(QFile::Append | QFile::Text)) 
     { 
      QMessageBox::warning(this,"File Access!!!","The File containing data of the   Items and Comments can't be acessed",QMessageBox::Ok); 
     } 
    }else 
     if(!files.open(QFile::WriteOnly | QFile::Text)) 
     { 
      QMessageBox::warning(this,"File Access!!!","The File containing data of the  Items and Comments can't be acessed",QMessageBox::Ok); 
     } 

    QTextStream out(&files); 
    out<< noofitems<<','; 

    files.flush(); 
    files.close(); 
} 

程序崩潰時,下列功能被稱爲

void MainWindow::on_listWidget_itemClicked(QListWidgetItem *item) 
{ 
    QListWidgetItem *itm=new QListWidgetItem; 
    itm->setText((char*)(ui->listWidget->currentRow())); 
    ui->listWidget_2->addItem(itm); 
} 
+0

您應該添加調試輸出以查看它在哪一行崩潰。 – hochl 2012-03-01 16:22:18

+0

我如何在通知的程序中做到這一點。我嘗試過,但程序不會編譯 – scorpion 2012-03-01 16:25:16

+0

添加一個包含'#include '然後做例如'qDebug()<<「point 1」;','qDebug()<<「point 2」; '圍繞你的線路來獲得調試輸出。或使用一個IDE(如QtCreator),它允許一步一步調試 – 2012-03-01 16:32:19

回答

3

嘗試以下方法:

void MainWindow::on_listWidget_itemClicked(QListWidgetItem *item) 
{ 
    Q_ASSERT(ui); 
    Q_ASSERT(ui->listWidget); 
    Q_ASSERT(ui->listWidget_2); 

    QListWidgetItem *itm=new QListWidgetItem; 
    itm->setText(QString::number(ui->listWidget->currentRow())); 
    ui->listWidget_2->addItem(itm); 
} 

如果任何斷言火災,這意味着要麼uiui->listWidgetui->listWidget_2未初始化。 另請注意我是如何更改將currentRow()轉換爲數字的行。這是更具可讀性,我不知道如果將行轉換爲(char *)實際上是使您的程序崩潰的行

+0

非常感謝您的程序崩潰,因爲類型鑄造char * 。這背後的原因是什麼? 願上帝保佑你。我討厭那些降低了初審者排名的人,以至於不能提出問題並得到解決。 – scorpion 2012-03-01 16:50:01

+2

如果你轉換一個整數,例如5到char *,你不會得到可讀的字符「5」,而是任何與ASCII碼5對齊的字符串。如果你想要「5」,你必須將53轉換爲char *,因爲字符串文字「5」有這個ASCII碼。長話短說,只要使用'QString :: number()','QString :: arg()'和'QString.toInt()'來編號<->字符串轉換與Qt,你不必關心ASCII等上。 – 2012-03-01 17:31:46

+1

您不能通過轉換將int整型轉換爲char *字符串,您需要特定的函數,如atoi或QString :: number()。 Casting將使任何函數將char *解釋爲4個字符,然後可能會繼續讀取int(< - crash)後面的(可能無效的)內存,直到找到空字節爲止,因爲它期望字符串爲空值終止。 – 2012-03-02 06:51:18