类似的问题已多次提出,但我专注于命名空间和指针问题.
MyClass.h
namespace foo {
class MyClass {
MyClass();
};
QDataStream &operator<<(QDataStream &out, const MyClass & myObj);
QDataStream &operator>>(QDataStream &in, MyClass &myObj);
} // namespace foo
Q_DECLARE_METATYPE(foo::MyClass) // #1
Q_DECLARE_METATYPE(foo::MyClass*) // #2
Run Code Online (Sandbox Code Playgroud)
fooMyClass.cpp(这么多的排列):
MyClass::MyClass()
{
qRegisterMetaType<MyClass>("MyClass"); // #3
qRegisterMetaType<MyClass*>("MyClass*"); // #4
qRegisterMetaType<MyClass>("foo::MyClass"); // #5
qRegisterMetaType<MyClass*>("foo::MyClass*"); // #6
qRegisterMetaType<foo::MyClass>("foo::MyClass"); // #7
qRegisterMetaType<foo::MyClass*>("foo::MyClass*"); // #8
qRegisterMetaType<MyClass>(); // #9
qRegisterMetaType<MyClass*>(); // #10
qRegisterMetaType<foo::MyClass>(); // #11
qRegisterMetaType<foo::MyClass*>(); // #12
// same for qRegisterMetaTypeStreamOperators<T>();
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,如果我打算在命名空间内部和外部使用信号和槽(可能作为引用和指针)的自定义对象,那么何时以及为什么需要提供命名空间和/或指针变量.我是否总是要完全限定名称空间?
我从QWidget派生类获得了一个包含三个QSpinBox(例如坐标)的类.该valueChanged()信号被连接,并且在至少这三种情况下被发射:
setValue()但是,在使用时setValue(),我想抑制信号,因为我不想有(三个)信号.根据我的理解,有两种方法可以解决这个问题:
QObject::blockSignals() 两种变体都有效,但我认为它们根本不是直截了当的:对于第一种,我通常会阻止所有信号,我需要blockSignals(true)为所有底层小部件设置(blockSignals不会阻止我的应用程序中的子QObject).对于第二个,我需要在每个更新方法中查询标志,并且虽然我不需要它们但信号会被提升.
是否存在阻止此类行为的一般设计模式?如果没有,您更喜欢哪种变体?
/**
* | A | B |
* | - | - |
* | 123 | This should be a long line with
* a line break without breaking the table |
* | A further | row |
*/
Run Code Online (Sandbox Code Playgroud)
Doxygen 在“with”之后停止表解析。我怎样才能防止这种行为?