#ifndef MASKMANAGER_H #define MASKMANAGER_H #include #include template class UniqueList { private: QList m_list; QSet m_set; public: const QList& getList() const { return m_list; } bool isEmpty() { return m_list.isEmpty(); } int size() const { return m_list.size(); } void appendUnique(const T& value) { if(m_set.contains(value)) return; m_set.insert(value); m_list.append(value); } void remove(const T& value) { if(m_set.remove(value)) { m_list.removeOne(value); } } T& first() { if(m_list.isEmpty()) throw std::out_of_range("UniqueList is empty"); return m_list.first(); } T& last() { if(m_list.isEmpty()) throw std::out_of_range("UniqueList is empty"); return m_list.last(); } T& at(int index) { if (index < 0 || index >= m_list.size()) throw std::out_of_range("Index out of range"); return m_list[index]; } T& operator[](int index) { return at(index); } }; class MaskLayer; class MaskManager : public QObject { Q_OBJECT public: //初始化时强制关联窗口 static void initialize(QWidget* mainWindow); static MaskManager* instance(); void showMask(QWidget* requester); void hideMask(QWidget* requester); protected: bool eventFilter(QObject* obj, QEvent* event) override; private: explicit MaskManager(QWidget* mainWindow); static MaskManager* m_instance; QWidget* m_mainWindow; QWidget* m_maskLayer; UniqueList m_activeRequests; }; #endif //MASKMANAGER_H