【问题标题】:How design a QWidget?如何设计一个QWidget?
【发布时间】:2013-12-11 13:36:56
【问题描述】:

QWidget-Class 的成员通常应该如何设计为 private 或 public?

class MyWidget : public QWidget {

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

class MyWidget : public QWidget {

   public:
       MyWidget( QWidget *parent = 0);

   private:
       QLineEdit *myLine;
}

我更喜欢使用私有成员的第二个定义,但是这个版本不好测试,因为我无法使用 findChild( QString ) 访问成员。

另一部分是 QWidget 类是否应该嵌套其他小部件?问题是没有直接访问嵌套的小部件,这对于自动 gui 测试来说并不是很有用,鼠标点击应该可以按下按钮或其他东西..

【问题讨论】:

  • 是什么阻止您向该类添加成员函数,例如QLineEdit *MyWidget::getLineEdit() const
  • 为什么我应该在这个解决方案中使用 private 修饰符? #define private public 也有可能,但很好?
  • #define private public?是开玩笑吗?

标签: qt private public qwidget


【解决方案1】:

第二种选择通常被认为是“最佳编程实践”,如果您需要通过其他地方(包括您的测试套件)的代码访问私有成员,那么您需要实现 getter 和 setter。

通常,测试框架也应该使用 API 来访问对象,而不是直接访问成员,因为您通常希望在单元测试中测试该 API。如果你真的不能放弃测试框架应该直接访问私有成员的想法,那么你可以考虑使用 C++ 友元类。但你没有从我这里听到。

如果您需要通用访问某些内容(例如通过字符串名称),这正是 Qt Properties 旨在为您做的事情。因此,将您的项目声明为属性并以这种方式列出 getters/setters/signals/etc。

除此之外:不幸的是,实现 getter 和 setter 有点无聊,这就是为什么我最终实现了一个 QtCreator plugin tool 来实现 getter、setter 并创建信号定义并发出信号。如果您将来需要真正做一些更复杂的事情,那么只需删除并用您更复杂的定义替换自动获取器/设置器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2020-07-09
    相关资源
    最近更新 更多