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);

これは、ビューを前後に切り替えると壊れます。また、前のビューに null ポイントを追加すると、そのビューに戻るとデータが失われます。

 /*
 *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);

カスタムデータ構造を作成せずに2つのビュー間の状態を維持するにはどうすればよいですか、またはこれは悪い習慣です。私はphpとWeb開発に最も精通しているので、これが最善の方法であるかどうかはわかりません.

前もって感謝します

4

2 に答える 2

1

見た目よりも複雑です。問題は、setCentralWidget()が呼び出されると currentcentralWidget()が削除されることです。NULLその内容を保持するには、親をまたはに変更してウィンドウから削除する必要があります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 に答える