调用QListWidgetItem setText()或setCheckState()使Qt应用程序崩溃。

问题描述 投票:0回答:1

我有一个应用程序,它需要用条目填充一个QListWidget。列表部件应该有2个数据条目。

  1. 名称
  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>
c++ qt qtgui qlistwidget qlistwidgetitem
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.