如何解耦复杂的Qt小部件类

时间:2016-05-05 13:54:39

标签: c++ qt widget

我有很多自定义Qt小部件,它们有自己的布局,并包含更多小部件的列表。 我最终拥有一个ManagerWidget来控制所有事件(包括监听所有事件)并将它们传播到需要更新其内容的窗口小部件。似乎有太多方法只能传递信息。

有更好的方法吗?通过信号/插槽连接类在这种情况下实际上并不起作用,因为它们有一个映射,我不知道哪一个被触发了。 介体模式是否适合这种情况?

class ManagerWidget : public QWidget {

public:
  map<ID, MainWidgetContainer*> mainWidgetMap;
  RecordsContainer *recentRecords; // This widget can contain any number of widgets, each showing a record

 // events are caught here and propagated to the widgets
  void AddNewEntry(ID id) {
    MainWidgetContainer *w = new MainWidgetContainer(id);
    mainWidgetMap.insert(id, w);
  }

  void UpdatePictureWidget(ID id) { 
     mainWidgetMap.value(id)->UpdatePictureWidget();
  }
  void AddXItem(ID id, Type1 k) { 
    if(id == 0)
        recentRecords->AddXItem(k);
    else
        mainWidgetMap.value(id)->AddXItem(k);
  }

  void UpdateEntry(ID id, string newName) {  }

};

class MainWidgetContainer : public QWidget {
public:
  NameWidget *name;
  PictureWidget *pic;
  RecordsContainer *records; // This widget can contain any number of widgets, each showing a record

  MainWidgetContainer(ID id) { 
   name = new NameWidget(id); 
   records = new RecordsContainer();
   pic = new PictureWidget();
   // setup layout and add items to records as they come in later
  }

  AddXItem(Type1 k) { records->AddXItem(k); } 
  UpdatePictureWidget() { pic->Update(); }

};

class RecordsContainer : public QWidget {
public:
  map<Type1, Item*> itemMap;

  AddXItem(Type1 k) { 
   Item *item = new Item(k);
   itemMap.insert(k, item);
   mainLayout->addWidget(item);
  }
  AddYItem(Type2 k);
  // etc

};

0 个答案:

没有答案