我有一个应用程序需要用条目填充QListWidget。列表小部件应该有2个数据条目:
-
-
复选框
使用
this
作为一些参考,并使之适应类似于
this
QListWidgetItem::setCheckedState()
,我得到以下结果:
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
,也
和
项目(
)但它总是在同一个地方坠毁。
跨过
item->setText(name);
callstack,我看到应用程序在此时崩溃:
qlistwidget.cpp文件
(
ref
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
调试器内容
在
发出数据更改()
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()
this
线路(如下所示)通过
this signal-slot connection
,但我完全不知道如何进一步追踪,也不知道这是怎么回事
q
void QListWidgetPrivate::_q_emitItemChanged(const QModelIndex &index)
{
Q_Q(QListWidget);
emit q->itemChanged(listModel()->at(index.row()));
}
问
已显示
here
连接信号和插槽。
在这里
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
调试器输出
在这里:
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>