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?
答案 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
。因此,没有模式可以遵循,也不需要将编辑操作抽象为接口。
有几种方法可以解决这个问题:
利用元对象系统已知的方法。请注意,QObject
采用方法名称,而非签名。
invokeMethod
您可以在任何支持编辑操作的小部件上使用上述独立功能。
如上所述,但缓存方法查找不会反复支付其成本。请注意,bool cut(QWidget * w) {
return QMetaObject::invokeMethod(w, "cut");
}
bool copy(QWidget * w) {
return QMetaObject::invokeMethod(w, "copy");
}
//...
采用方法签名,而不仅仅是其名称。
indexOfMethod
定义一个接口并提供专门用于窗口小部件类型的实现。这种方法的唯一好处是它比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