私は単純なカタログ アプリケーションをデバッグしてきましたが、この問題に悩まされ始めています。提示されたデータに対するユーザー入力を受け取るモーダル ダイアログを作成したいと考えています。カタログ アイテム データを保持する単純な構造体があります。
struct ItemData {
int nodeType;
int nodeID;
int nodeLevel;
QString nodeName;
QString nodeNote;
QString fileName;
}
次に、データ入力ダイアログで項目データを表す構造体
struct DialogData {
QString name;
QString note;
QString file;
}
これで、データ入力ダイアログがメイン ウィンドウのeditRec()
メソッドから呼び出されます。
void MainWindow::editRec()
{
// model is defined in the main window, getSelectedRowData()
// fills the struct with data properly
ItemData md = model->getSelectedRowData(ui->treeView->selectionModel());
// data, on wich the dialog will operate
DialogData dd;
dd.name = md.nodeName;
dd.note = md.nodeNote;
dd.file = md.fileName;
// checking whether the data wich is being read from the model
// and being passed to dialog is correct
// qDebug '<<' operator is overloaded to handle my structs
// qDebug << md; // - outputs data properly, then crashes the program
// qDebug << dd; // - also, outputs data properly, then crashes the program
// suspecting the error in the '<<' overload, I tried to output
// one field at a time and it works if I if uncomment one
// line at a time, but crashes the application if I try to
// output all fields in one go.
// qDebug() << md.nodeType;
// qDebug() << md.nodeID;
// qDebug() << md.nodeLevel;
// qDebug() << md.nodeName;
// qDebug() << md.nodeNote;
// qDebug() << md.fileName;
DataDialog *dialog;
// dialog's interface and data handling differs depending on
// the type of the node it will operate on
switch (md.nodeType) {
case NODE_ROOT: {
dialog = new DataDialog(dlgEditRoot, false, this);
dialog->setDialogData(dd, NODE_ROOT);
break;
}
case NODE_BRANCH: {
dialog = new DataDialog(dlgEditBranch, false, this);
dialog->setDialogData(dd, NODE_BRANCH);
break;
}
}
dialog->initWidgets();
if (dialog->exec() == QDialog::Accepted) { // showing a modal dialog
// if user changed the data, modifying the model with the new data
if (dialog->isDataChanged) {
dd = dialog->getDialogData();
switch (md.nodeType) {
case NODE_ROOT: {
md.nodeName = dd.name;
md.nodeNote = dd.note;
md.fileName = dd.file;
model->setSelectedRowData(ui->treeView->selectionModel(), md);
break;
}
case NODE_BRANCH: {
md.nodeName = dd.name;
md.nodeNote = dd.note;
md.fileName = dd.file;
model->setSelectedRowData(ui->treeView->selectionModel(), md);
break;
}
}
}
}
qDebug() << md; // - both of these output data correctly without any crashes
qDebug() << dd; //
delete dialog;
}
最初の 3 つのデータ ダンプをコメント アウトするqDebug()
と、すべてが意図したとおりに機能します。
StackOverflow で、やや類似した問題が 2 つだけ見つかりました。
ここで何が間違っていますか?