Qt novice: base class for QLineEdit and QTextEdit

时间:2017-12-18 05:20:53

标签: qt qwidget

Is there another class besides QWidget which holds all generic functions for both? Something like QEdit...

As an example I'd like to reference cut(), copy() and paste(), but it looks like I have to dynamic cast the QWidget. Is there any other way?

2 个答案:

答案 0 :(得分:1)

There is no other way besides QWidget. The reason is that QLineEdit is inherited directly from QWidget. You can see the full hierarchy of Qt classes here

答案 1 :(得分:1)

你不需要动态投射任何东西:这通常是糟糕设计的标志。 Qt通常只有很少的接口类 - 它们通常在名称的某处有单词ConfigurationManager,并且它们不是真正的纯接口,因为它们具有非抽象基类,例如Abstract。因此,没有模式可以遵循,也不需要将编辑操作抽象为接口。

有几种方法可以解决这个问题:

  1. 利用元对象系统已知的方法。请注意,QObject采用方法名称,而非签名。

    invokeMethod

    您可以在任何支持编辑操作的小部件上使用上述独立功能。

  2. 如上所述,但缓存方法查找不会反复支付其成本。请注意,bool cut(QWidget * w) { return QMetaObject::invokeMethod(w, "cut"); } bool copy(QWidget * w) { return QMetaObject::invokeMethod(w, "copy"); } //... 采用方法签名,而不仅仅是其名称。

    indexOfMethod
  3. 定义一个接口并提供专门用于窗口小部件类型的实现。这种方法的唯一好处是它比static QMetaMethod lookup(QMetaObject * o, const char * signature) { return o->method(o->indexOfMethod(signature)); } struct Methods { QMetaMethod cut, copy; Methods() {} explicit Methods(QMetaObject * o) : cut(lookup(o, "cut()")), copy(lookup(o, "copy()")) {} Methods(const Methods &) = default; }; // Meta class names have unique addresses - they are effectively memoized. // Dynamic metaobjects are an exception we can safely ignore here. static QMap<const char *, Methods> map; static const Methods & lookup(QWidget * w) { auto o = w->metaObject(); auto it = map.find(o->className()); if (it == map.end()) it = map.insert(o->className(), Methods(o)); return *it; } bool cut(QWidget * w) { lookup(w).cut.invoke(w); } bool copy(QWidget * w) { lookup(w).copy.invoke(w); } //... 快一点。将此代码用于剪贴板方法没有多大意义,但是对于经常调用的小方法的开销最小化可能很有用。除非基准测试表明它确实有帮助,否则我建议不要过度设计它。之前的方法(上面的#2)应该足够了。

    QMetaMethod::invoke