Как спроектировать QWidget?

как должен член класса QWidget-класса обычно проектироваться как частный или общедоступный?

class MyWidget : public QWidget {

   public:
       MyWidget( QWidget *parent = 0);
       QLineEdit *myLine;
}

or

class MyWidget : public QWidget {

   public:
       MyWidget( QWidget *parent = 0);

   private:
       QLineEdit *myLine;
}

Я предпочитаю второе определение с закрытым членом, но эту версию плохо тестировать, потому что у меня нет доступа к члену с findChild(QString).

Другая часть заключается в том, должен ли класс QWidget вкладывать другие виджеты? Проблема в том, что нет прямого доступа к вложенным виджетам, и это не очень полезно для автоматических тестов графического интерфейса, где щелчок мыши должен нажимать кнопку или что-то еще.


person Andreas    schedule 11.12.2013    source источник
comment
Что мешает вам добавить в этот класс функции-члены, например QLineEdit *MyWidget::getLineEdit() const?   -  person vahancho    schedule 11.12.2013
comment
Почему я должен использовать приватный модификатор с этим решением? Возможно, #define тоже частное общедоступное, но хорошо?   -  person Andreas    schedule 11.12.2013
comment
#define private public? Это шутка?   -  person vahancho    schedule 11.12.2013


Ответы (1)


Второй вариант обычно считается «лучшей практикой программирования», и если вам нужно получить доступ к закрытым членам через код откуда-то еще (включая ваш набор тестов), вам необходимо реализовать геттеры и сеттеры.

Как правило, среды тестирования также должны использовать API для доступа к объектам, а не для прямого доступа к членам, поскольку именно этот API вы обычно хотите тестировать в модульных тестах. Если вы действительно не можете отказаться от идеи, что тестовая среда должна напрямую обращаться к закрытым членам, вы можете изучить использование дружественных классов С++. Но вы не слышали этого от меня.

Если вам нужен общий доступ к чему-то (например, по имени строки), это именно то, что Qt Properties создано для вас. Поэтому объявите свои элементы как свойство и перечислите геттеры/сеттеры/сигналы/и т. д. таким же образом.

В стороне: к сожалению, реализация геттеров и сеттеров довольно скучная работа, поэтому я в итоге реализовал плагин QtCreator который реализует геттеры, сеттеры, создает определения сигналов и испускает сигнал. Если вам когда-нибудь понадобится сделать что-то более сложное в будущем, просто удалите и замените автоматический геттер/сеттер своими более сложными определениями.

person Wes Hardaker    schedule 11.12.2013