Как объявить глобальный QWidget? - PullRequest
0 голосов
/ 23 января 2020

Я хочу иметь класс, расширяющий QWidget, к которому я могу получить доступ во всей моей программе. Я уже пытался объявить его в основном. cpp (но это явно не объявлено в других файлах) или к нему после объявления класса (в этом случае, если я включаю файл более одного раза, я получить ошибку multiple declaration).

Возможно ли использование виджета как глобального, и если да, то как?

Редактировать:

Что я хочу сделать, это записать информацию во второе окно, которое является экземпляром класса Console (я написал этот класс).

Затем у меня есть класс MainWindow с классами, которые он содержит; computing_widget и variable_widget, которые содержат соответственно список вычислений и переменных.

Я хочу иметь возможность писать в окне консоли из всех этих классов.

1 Ответ

0 голосов
/ 26 января 2020

Я не рекомендую использовать это, но это будет лучше, чем глобальный указатель. Если ваше окно (-ы) вам нужно только один раз в приложении, вы можете использовать шаблон Singleton (Anti-).

Это класс SingletonTemplate.

#ifndef __CSingletonTemplate_H__
#define __CSingletonTemplate_H__

template <class T> class CSingletonTemplate
{                                                                         
public:
  static T* GetInstance()
  {
    if (m_Instance == 0)
    {
      m_Instance = new T();
    }
    return m_Instance;
  }

  static T& GetRefInstance()
  {
    if (m_Instance == 0)
    {
      m_Instance = new T();
    }
    return *m_Instance;
  }

  static void Release()
  {
    if (m_Instance != 0)
    {
      delete m_Instance;
      m_Instance = 0;
    }
  }

protected:
  CSingletonTemplate() { ; };                                       // Hidden constructor
  CSingletonTemplate(CSingletonTemplate const&) { ; };              // Hidden copy constructor
  CSingletonTemplate& operator=(CSingletonTemplate const&) { ; };   // Hidden assign operation
  ~CSingletonTemplate() { ; };                                      // Hidden destructor

private:
  static T* m_Instance;
};

template <class T>  T* CSingletonTemplate<T>::m_Instance = 0;                              

#endif // __CSingletonTemplate_H__

Вы используете его объявив класс следующим образом:

class MyWindow : public CSingletonTemplate<MyWindow>
{
  friend class CSingletonTemplate<MyWindow>;

private:
  MyWindow();
  virtual ~MyWindow();
  Q_DISABLE_COPY(MyWindow);
};

И вы можете использовать этот класс, мой вызов MyWindow :: GetInstance () -> ...

Для получения дополнительной информации о посещении шаблона Singleton: https://sourcemaking.com/design_patterns/singleton

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...