我有一个关于在QMainWindows之间拖动QDockWidgets的问题.我有一个具有不同"DockAreas"的应用程序,它有一个带有一个或多个QDockWidgets的QMainWindow成员.另外,我想让QDockWidgets可以拖放到其他已经浮动的QDockWidgets(没有标签!).
为了在拖放时获得漂亮的悬停效果,浮动QDockWidgets嵌入到具有QMainWindow成员的DockArea的新实例中.现在我拦截拖动的QDockWidget的mousemove事件,并在它悬停在我的DockArea的另一个QMainWindow时更改其父级.不幸的是,这会导致崩溃,看起来这个QDockWidget所在的原始QLayoutItem已经消失了.
void QDockWidgetPrivate::moveEvent(QMoveEvent *event)
{
// ...
// now this widgetItem member of state is kaputt
layout->hover(state->widgetItem, globalMousePos);
}
Run Code Online (Sandbox Code Playgroud)
我发现了在互联网上QMainWindows之间拖放QDockWidgets的不同建议:
1)重新养育 - 这就是我正在尝试的东西
2)QDrag - 对我不起作用,async exec()打破了我的应用程序,最后我还是要重新调试
3)调用新QMainWindow的addDockWidget(...) - 停靠QDockWidget,我将不得不再次浮动并以某种方式"继续拖动"
我对任何新建议持开放态度:)提前谢谢!
我有枚举类,QVariants和QSettings类的问题.我想要存储在QVariant中的枚举类值,该QVariant进入QSettings实例.所以,我的代码实际上看起来像这样:
enum class Foo
{
Bar1, Bar2
}
Q_ENUMS(Foo)
Q_DECLARE_METATYPE(Foo)
...
Foo value = Bar2;
QSettings settings;
settings.setValue(QString("Foo"), QVariant::fromValue(value));
Run Code Online (Sandbox Code Playgroud)
此时执行代码时,断言跳进并抱怨:
ASSERT failure in QVariant::save: "Invalid type to save", file kernel\qvariant.cpp
Run Code Online (Sandbox Code Playgroud)
在互联网上搜索,我发现该类缺少一个合适的<<和>>运算符.但这不是枚举类的选项.我甚至试过用
qRegisterMetaType<Foo>("Foo");
Run Code Online (Sandbox Code Playgroud)
但它没有帮助.也许你有一些其他的建议/解决方案.谢谢!