Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

62 řádky
1.7 KiB

  1. // registermanager.cpp
  2. #include "registermanager.h"
  3. #include "item.h"
  4. RegisterManager::RegisterManager(QObject *parent) : QObject(parent) {}
  5. void RegisterManager::bindItem(Item* item, const QString& registerId)
  6. {
  7. if (registerId.isEmpty() || !item) return;
  8. // 添加到映射表
  9. registerMap[registerId].append(item);
  10. // 连接图元销毁信号
  11. connect(item, &Item::destroyed, this, [this, item, registerId](){
  12. if (registerMap.contains(registerId)) {
  13. registerMap[registerId].removeAll(item);
  14. if (registerMap[registerId].isEmpty()) {
  15. registerMap.remove(registerId);
  16. }
  17. }
  18. });
  19. }
  20. void RegisterManager::unbindItem(Item *item, const QString &registerId)
  21. {
  22. if (registerMap.contains(registerId)) {
  23. // 从寄存器映射中移除元件
  24. QList<Item*>& items = registerMap[registerId];
  25. items.removeAll(item);
  26. // 如果列表为空则移除整个条目
  27. if (items.isEmpty()) {
  28. registerMap.remove(registerId);
  29. }
  30. // 断开该寄存器的销毁信号连接
  31. disconnect(item, &Item::destroyed, this, nullptr);
  32. }
  33. }
  34. void RegisterManager::updateRegisterValue(const QString& registerId, quint16 value)
  35. {
  36. if (!registerMap.contains(registerId)) return;
  37. // 更新所有绑定该寄存器的图元
  38. for (Item* item : registerMap[registerId]) {
  39. item->setRegisterValue(registerId, value);
  40. item->update(); // 刷新显示
  41. }
  42. }
  43. QStringList RegisterManager::getAllRegisteredRegisters() const
  44. {
  45. return registerMap.keys();
  46. }
  47. QList<Item*> RegisterManager::getItemsForRegister(const QString& registerId) const
  48. {
  49. return registerMap.value(registerId, QList<Item*>());
  50. }