代码之家  ›  专栏  ›  技术社区  ›  CybeX

在Qt应用程序上调用QListWidgetItem setText()或setCheckState()

  •  1
  • CybeX  · 技术社区  · 4 年前

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

    1. 复选框

    使用 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>
    
    1 回复  |  直到 4 年前