我有一个应用程序,它需要用条目填充一个QListWidget。列表部件应该有2个数据条目。
使用 这个 作为一些参考,并将其改编为类似于《中国的发展》的东西。这个 使用户可以更改 QListWidgetItem::setCheckedState()我得到以下结果。
MainWindow构造函数
MainWindow::MainWindow(QWidget* parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//...
// Called AFTER ui is setup
// Call stack for the method below is: initGui > connectSettings > connectDriveListChanges > updateDrivesList
updateDrivesListWidget();
//...
}
后面在构造函数中,这个是被调用的。
void MainWindow::updateDrivesListWidget() {
//...
// Get name of item
QString name = QString("Local Disk (%1)").arg(s);
bool enabled = attachedDriveList.value(s);
// create item for QListWidget named listDriveInfo on form
// QListWidgetItem* item = new QListWidgetItem(name, ui->listDriveInfo); <---crashes when setting text
QListWidgetItem* item = new QListWidgetItem(ui->listDriveInfo);
//set checkable and state
item->setText(name); < -----tried as alternative to crash above
item->setCheckState(enabled ? Qt::Checked : Qt::Unchecked);
Qt::ItemFlags localFlags = item->flags();
localFlags = localFlags | Qt::ItemIsUserCheckable;
item->setFlags(localFlags);
// add item to list
ui->listDriveInfo->addItem(item);
//...
}
我也跑过 运行qmake又 干净 和 重建 该项目(以防对listWidget的一些无效引用。)但它一直在这个地方崩溃。
踏过 item->setText(name);
调用堆栈,我看到应用程序在这时崩溃了。
qlistwidget.cpp (档号)
void QListModel::itemChanged(QListWidgetItem *item, const QVector<int> &roles)
{
const QModelIndex idx = index(item);
emit dataChanged(idx, idx, roles); <-------crash when emitting signal
}
呼叫栈在这里 在 emit dataChange()
行
1 QListModel::itemChanged qlistwidget.cpp 455 0x172b4ee8
2 QListWidgetItem::setData qlistwidget.cpp 745 0x172b5c28
3 QListWidgetItem::setText qlistwidget.h 179 0x4b2a7e
4 MainWindow::updateDrivesListWidget MainWindow.cpp 1074 0x44d953
5 MainWindow::updateDrivesList MainWindow.cpp 1390 0x45015b
6 MainWindow::connectDriveListChanges MainWindow.cpp 933 0x44c83d
7 MainWindow::connectSettings MainWindow.cpp 466 0x448161
8 MainWindow::initGui MainWindow.cpp 57 0x444b4c
9 MainWindow::MainWindow MainWindow.cpp 17 0x44449f
10 qMain main.cpp 230 0x466faf
11 WinMain *16 qtmain_win.cpp 97 0x48df70
12 main 0x4e0bfd
调试器内容 在 emit dataChange()
行
idx @0x56af450 QModelIndex
c 0 int
i 783195744 quintptr
m @0x2e9a2b18 QListModel
r 0 int
item @0x2eae9e60 QListWidgetItem
[vptr] _vptr.QListWidgetItem
d @0x2eb36c80 QListWidgetItemPrivate
dummy <0 items> QVector<void*>
itemFlags (Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled) (0x0035) Qt::ItemFlags
rtti 0 int
view "listDriveInfo" QListWidget
roles <2 items> QVector<int> &
0 int
2 int
this @0x2e9a2b18 QListModel
[QAbstractListModel] @0x2e9a2b18 QAbstractListModel
[d] @0x2e9a32f0 QAbstractItemModelPrivate
[parent] "listDriveInfo" QListWidget
[children] <0 items>
[properties] <at least 0 items>
[methods] <0 items>
[extra]
cachedIndexes <0 items> QModelIndexList
items <1 items> QList<QListWidgetItem*>
staticMetaObject @0x17425334 QMetaObject
知道为什么这时可能会崩溃吗?
更新 (不是解决方案),只是一个延伸
从发出的信号 emit dataChanged(idx, idx, roles);
在函数中 QListModel::itemChanged()
它达到 这个 线(如下图所示),通过 此信号槽连接但我完全不知道如何进一步追踪它,也不知道这到底是什么。q
指的是。
void QListWidgetPrivate::_q_emitItemChanged(const QModelIndex &index)
{
Q_Q(QListWidget);
emit q->itemChanged(listModel()->at(index.row()));
}
q
是指 此处 连接信号& 槽。
堆栈跟踪 此处
1 QListWidgetPrivate::_q_emitItemChanged qlistwidget.cpp 1198 0x171948ac
2 QListWidget::qt_static_metacall moc_qlistwidget.cpp 196 0x17198264
3 QMetaObject::activate qobject.cpp 3809 0x6bb282a7
4 QMetaObject::activate qobject.cpp 3660 0x6bb2851b
5 QAbstractItemModel::dataChanged moc_qabstractitemmodel.cpp 557 0x6bac9e3f
6 QListModel::itemChanged qlistwidget.cpp 455 0x17194eff
7 QListWidgetItem::setData qlistwidget.cpp 745 0x17195c28
8 QListWidgetItem::setText qlistwidget.h 179 0x4b2a7e
9 MainWindow::updateDrivesListWidget MainWindow.cpp 1074 0x44d953
10 MainWindow::updateDrivesList MainWindow.cpp 1390 0x45015b
11 MainWindow::connectDriveListChanges MainWindow.cpp 933 0x44c83d
12 MainWindow::connectSettings MainWindow.cpp 466 0x448161
13 MainWindow::initGui MainWindow.cpp 57 0x444b4c
14 MainWindow::MainWindow MainWindow.cpp 17 0x44449f
15 qMain main.cpp 230 0x466faf
16 WinMain *16 qtmain_win.cpp 97 0x48df70
17 main 0x4e0bfd
调试器输出 在这里,我有一个应用程序,需要在QListWidget中填充条目。
Locals
index @0x56af450 QModelIndex &
c 0 int
i 783486936 quintptr
m @0x2e9e3280 QListModel
[QAbstractListModel] @0x2e9e3280 QAbstractListModel
[d] @0x2e9e3a58 QAbstractItemModelPrivate
[parent] "listDriveInfo" QListWidget
[children] <0 items>
[properties] <at least 0 items>
[methods] <0 items>
[extra]
cachedIndexes <0 items> QModelIndexList
items <1 items> QList<QListWidgetItem*>
staticMetaObject @0x17305334 QMetaObject
r 0 int
Inspector
Expressions
Return Value
Tooltip
q <not accessible>