0

我继承了 QmainWindow 类,用作我正在构建的应用程序的主窗口。
我已将中央小部件设置为指向我创建的另一个类的指针。

//main window constructor
postEntryWidget = 0; // null pointer to another class that extends QWidget
dataEntryWidget = new Data_Entry_Widget; //extends QWidget
setCentralWidget(dataEntryWidget); //set the widget in the main window

当用户点击一个动作时,这会将中央小部件设置为另一个指向另一个小部件类的指针。

/*
 *this is the implementation of the slot that would be connected to the QAction
 *connected to the postEntryWidget slot
 */
if(!postEntryWidget)
    postEntryWidget = new Post_Entry_Widget;
setCentralWidget(postEntryWidget);

/*
 *this is the implementation of the slot that would be connected to the QAction
 *connected to the dataEntryWidget slot
 */
if(!dataEntryWidget)
    dataEntryWidget = new Post_Entry_Widget;
setCentralWidget(dataEntryWidget);

在视图之间来回切换时会中断。如果我在前面的视图中添加一个空点,当我回到那个视图时,我会丢失数据。

 /*
 *this is the implementation of the slot that would be connected to the QAction
 *connected to the postEntryWidget slot
 */
dataEntryWidget = 0; //set the previous widget to a null pointer but loses data
if(!postEntryWidget)
    postEntryWidget = new Post_Entry_Widget;
setCentralWidget(postEntryWidget);

如何在不创建自定义数据结构的情况下保持两个视图之间的状态,或者这是一种不好的做法。我最熟悉 php 和 web 开发,所以我不确定这是否是最好的方法。

提前致谢

4

2 回答 2

1

它比看起来更复杂。问题是,当setCentralWidget()被调用时,当前centralWidget()被删除。为了保留其内容,您需要通过将其重新设置为NULLor来将其从窗口中删除0。尝试将您的代码更改为:

if(!postEntryWidget)
    postEntryWidget = new Post_Entry_Widget;
if (centralWidget()) centralWidget()->setParent(0); //reparent if exists
setCentralWidget(postEntryWidget);

/*
...
*/

if(!dataEntryWidget)
    dataEntryWidget = new Post_Entry_Widget;
if (centralWidget()) centralWidget()->setParent(0); //reparent if exists
setCentralWidget(dataEntryWidget);
于 2012-07-06T18:48:21.347 回答
1

不完全确定你的目标是什么。但是,如果您试图让某人能够回到他们正在从事的工作,那么也许您最好使用选项卡小部件而不是隐藏该工作的存在?

QTabWidget 文档

Qt 选项卡式对话框示例

所以你要把它作为你的中心小部件,并在它下面插入Post_Entry_WidgetData_Entry_Widget实例。这样做的一个优点是 Qt 为您管理选项卡切换。

如果您不想要选项卡,还有一个QStackedWidget,它只允许您以编程方式在一组小部件之间切换。

于 2012-07-06T17:15:59.840 回答