diff --git a/plugins/bluetooth/componments/bluetoothadapteritem.cpp b/plugins/bluetooth/componments/bluetoothadapteritem.cpp index c227e2db3..514c76ea3 100644 --- a/plugins/bluetooth/componments/bluetoothadapteritem.cpp +++ b/plugins/bluetooth/componments/bluetoothadapteritem.cpp @@ -170,6 +170,7 @@ void BluetoothAdapterItem::onTopDeviceItem(DStandardItem *item) return; int index1 = item->row(); + // 先获取,再移除,后插入 QStandardItem *index = m_deviceModel->takeItem(index1, 0); m_deviceModel->removeRow(index1); m_deviceModel->insertRow(0, index); @@ -216,7 +217,8 @@ QStringList BluetoothAdapterItem::connectedDevicesName() void BluetoothAdapterItem::initData() { m_showUnnamedDevices = m_bluetoothInter->displaySwitch(); - if (!m_adapter->powered()) + + if (m_adapter && !m_adapter->powered()) return; foreach (const auto device, m_adapter->devices()) { @@ -246,10 +248,10 @@ void BluetoothAdapterItem::onDeviceAdded(const Device *device) } }); - m_deviceItems.insert(device->id(), item); - if (!m_showUnnamedDevices && device->name().isEmpty() && Device::StateConnected != device->state()) + if (!m_showUnnamedDevices && device->name().isEmpty()) return; + m_deviceItems.insert(device->id(), item); m_deviceModel->insertRow(insertRow, item->standardItem()); emit deviceCountChanged(); } @@ -259,7 +261,18 @@ void BluetoothAdapterItem::onDeviceRemoved(const Device *device) if (m_deviceItems.isEmpty()) return; - m_deviceModel->removeRow(m_deviceItems.value(device->id())->standardItem()->row()); + int row = -1; + if (!m_deviceItems.value(device->id())) + return; + + row = m_deviceItems.value(device->id())->standardItem()->row(); + if ((row < 0) || (row > m_deviceItems.size() - 1)) { + m_deviceItems.value(device->id())->deleteLater(); + m_deviceItems.remove(device->id()); + return; + } + + m_deviceModel->removeRow(row); m_deviceItems.value(device->id())->deleteLater(); m_deviceItems.remove(device->id()); emit deviceCountChanged(); @@ -406,7 +419,6 @@ void BluetoothAdapterItem::setUnnamedDevicesVisible(bool isShow) return; } - for (i = m_deviceItems.begin(); i != m_deviceItems.end(); ++i) { BluetoothDeviceItem *deviceItem = i.value();