كيو تي:قم بإنشاء QItemDelegate للحصول على محرر مخصص (مربعات التحرير والسرد) في QTableView باستخدام QStandardItemModel
-
12-12-2019 - |
سؤال
أحتاج إلى تنفيذ جدول في Qt يعرض مربع تحرير وسرد في كل صف في عمود معين.
حتى الآن بناءً على هذا المثال:http://doc.qt.nokia.com/4.7-snapshot/itemviews-spinboxdelegate.htmlوعلى هذا السؤال:QStandardItem + QComboBoxلقد تمكنت بنجاح من إنشاء QItemDelegate.
مشكلتي هي أن كل شيء يعمل بشكل جيد إذا قمت بتنفيذه من وظيفتي main() في main.cpp، لكنه لا يعمل بشكل جيد إذا قمت بإدراج الجدول في Qt Designer لاستخدامه بعد ذلك ضمن وظيفة من فئة MainWindow في mainwindow.cpp .
هل يمكن أن تعطيني فكرة؟شكرا لك مقدما!
التفويض على main.cpp (يعمل بشكل جيد، عندما أنقر نقرًا مزدوجًا على العمود الثاني يظهر مربع التحرير والسرد):
QStandardItemModel model(4, 2);
QTableView tableView;
tableView.setModel(&model);
ComboBoxDelegate delegate;
tableView.setItemDelegateForColumn(1,&delegate);
tableView.horizontalHeader()->setStretchLastSection(true);
for (int row = 0 ; row < 4; ++row) {
for (int col = 0; col < 2; ++col) {
QModelIndex index = model.index(row, col, QModelIndex());
model.setData(index, QVariant((row+1) * (col+1)));
}
}
tableView.show();
التفويض على البديل mainwindow.cpp 1 (يُظهر جدولًا فارغًا)
QStandardItemModel model(4,2);
ui->tablePoint->setModel(&model);
ComboBoxDelegate delegate;
ui->tablePoint->setItemDelegateForColumn(1,&delegate);
ui->tablePoint->horizontalHeader()->setStretchLastSection(true);
for (int row = 0 ; row < 4; ++row) {
for (int col = 0; col < 2; ++col) {
QModelIndex index = model.index(row, col, QModelIndex());
model.setData(index, QVariant((row+1) * (col+1)));
}
}
التفويض على البديل mainwindow.cpp 2 (يظهر الجدول ولكن عندما أنقر نقرًا مزدوجًا على العمود الثاني فإنه لا يظهر مربع التحرير والسرد.بدلاً من ذلك يظهر صندوق الدوران العادي):
QStandardItemModel* model = new QStandardItemModel(4,2);
ui->tablePoint->setModel(model);
ComboBoxDelegate delegate;
ui->tablePoint->setItemDelegateForColumn(1,&delegate);
ui->tablePoint->horizontalHeader()->setStretchLastSection(true);
for (int row = 0 ; row < 4; ++row) {
for (int col = 0; col < 2; ++col) {
QModelIndex index = model->index(row, col, QModelIndex());
model->setData(index, QVariant((row+1) * (col+1)));
}
}
المحلول
بافتراض أنه في كلتا الحالتين mainwindow.cpp، فإن الكود الذي تعرضه موجود في المنشئ، فأنت تفعل الخطأ الكلاسيكي "القادم من java أو python أو perl أو أي لغة لا تهتم فيها بإدارة الذاكرة" لتخصيص النموذج الخاص بك و/أو التفويض على المكدس بدلاً من الكومة.
في لغة C++، الأشياء المخصصة على المكدس (على سبيل المثال: QStandardItemModel model(4,2);
) عند العودة من الوظيفة، بينما يتم تخصيص العناصر في الكومة (على سبيل المثال. QStandardItemModel* model = new QStandardItemModel(4,2);
يعيش حتى لك delete
هو - هي).تعمل الحالة 1 لأن العناصر المخصصة على المكدس موجودة main()
يعيش طوال مدة التطبيق.
الحد الأدنى:بالنسبة للحالة 3، قم بإجراء أ ComboBoxDelegate* delegate = new ComboBoxDelegate();
و ui->tablePoint->setItemDelegateForColumn(1,delegate);