2013-11-20 4 views
1

У меня есть QTableWidget, который вызывает QDialog при нажатии на определенную ячейку. После закрытия QDialog QDialog удаляется. Когда я пытаюсь щелкнуть ячейку снова, моя программа рушится. getDaInx() и getDaSMAC() возвращают QStringLists. Они должны быть совершенно не связаны с тем, что у меня есть. Вот исходный код:Откат объекта Qt, вызывающий сбой

QDialog *removeDialog; 

// connect in MainWindow constructor 
connect(ui->theTable, SIGNAL(cellClicked(int,int)), this, SLOT(handleCellClick(int,int))); 

void MainWindow::handleCellClick(int row, int col) 
{ 
    if (col == 9) 
    { 
     if (row > 0) 
     { 
      QGridLayout *removeLayout = new QGridLayout(); 

      for (int x = 1; x < getDaInx().length(); x++) 
      { 
       if (getDaInx().length() != getDaSMAC().length()) break; 

       QString device = getDaSMAC()[x]; 
       QString inx = getDaInx()[x]; 

       QCheckBox *checkBox = new QCheckBox(QString("Remove %1 %2").arg(inx).arg(device)); 
       if (x == row) checkBox->setChecked(true); 
       checkBox->setParent(removeDialog); 

       removeLayout->addWidget(checkBox, x, 0); 
      } 

      QPushButton *okBtn = new QPushButton("OK", removeDialog); 
      QPushButton *cancelBtn = new QPushButton("Cancel", removeDialog); 

      connect(okBtn, SIGNAL(clicked()), this, SLOT(handleRemoveDialogOk())); 
      connect(cancelBtn, SIGNAL(clicked()), this, SLOT(handleRemoveDialogCancel())); 

      int rowCount = removeLayout->rowCount(); 

      removeLayout->addWidget(okBtn, rowCount, 0); 
      removeLayout->addWidget(cancelBtn, rowCount, 1); 

      removeDialog = new QDialog(this); 

      removeDialog->setLayout(removeLayout); 

      removeDialog->exec(); 

      disconnect(okBtn, SIGNAL(clicked()), this, SLOT(handleRemoveDialogOk())); 
      disconnect(cancelBtn, SIGNAL(clicked()), this, SLOT(handleRemoveDialogCancel())); 

      delete removeDialog; 
     } 
    } 
} 
+1

Вы запустили его в отладчике? Почему не удаляетDialog локальную переменную? –

+0

removeDialog не является локальной переменной, поскольку используется в MainWindow :: handleRemoveDialogOk(). –

+1

Что говорит отладчик? Отчет о сбоях/Трассировка стека? – Till

ответ

2

Вы получаете ошибки, потому что вы используете removeDialog указатель перед тем как инициализировать его:

//... 
checkBox->setParent(removeDialog); 
//... 
QPushButton *okBtn = new QPushButton("OK", removeDialog); 
QPushButton *cancelBtn = new QPushButton("Cancel", removeDialog); 
//... 
removeDialog = new QDialog(this); 
+0

Ха да, я только что увидел это. Не знаю, почему я этого раньше не видел. –

3

Попробуйте создать эти:

QPushButton *okBtn = new QPushButton("OK", removeDialog); 
    QPushButton *cancelBtn = new QPushButton("Cancel", removeDialog); 

После этого:

removeDialog = new QDialog(this); 
+3

Этот код в этой ситуации: _checkBox-> setParent (removeDialog); _ – Zlatomir

Смежные вопросы