2

ユーザー向けにいくつかのフォームを生成し、それらに入力させてから、シリアル化されるバイナリ検索ツリーにフォームを保存するQtGUIを作成しています。これは、Qt(明らかに)、c ++、およびboostを使用して行われます。現時点では、GUIがアプリケーションとの唯一のインターフェースです。メインのGUIクラス内で作成するのは悪いデザインパターンのようであるため、GUIの外部でバイナリ検索ツリーオブジェクトをインスタンス化したいと思います。これは正しい考えですか?

これが私のmain()今です:

int main (int argc, char *argv[])
{
    QApplication app(argc, argv);
    ChocAnGui *gui = new ChocAnGui;
    gui->show();

    return app.exec();
}

ChocAnGuiクラスが使用できるが実際のGUIの外にあるBSTオブジェクトを作成する方法はありますか?私は次のようなことをしたいと思います:

int main (int argc, char *argv[])
{
    MyBST bst = new MyBST;
    MyRecord record = new MyRecord;

    QApplication app(argc, argv);
    ChocAnGui *gui = new ChocAnGui;
    gui->show();

    return app.exec();
}

MyBST次に、GUIが内部からおよびMyRecordクラスのメソッドを呼び出せるようにしたいと思います。アプリケーションの開始時と終了時にデータのシリアル化と逆シリアル化を行っているため、これは最も抽象的なアプローチのようです(GUIコード自体からのシリアル化と逆シリアル化とは異なります)。この質問が明確であることを願っています...私たちが話している間、私はこれらすべてのことを学んでいます。それらの変数を通過させる方法はありQApplication(argc, argv)ますか?最終的には、レコードクラスとBSTクラスがデータベースに組み込まれ、GUIの外部でインスタンスを作成するのが最も簡単に思えます。あなたが提供できるどんな入力にも感謝します。

4

2 に答える 2

1

バイナリ検索に時間がかかり、GUIのスレッドをブロックできる場合にのみ、バイナリ検索ツリーをGUIスレッドの外に配置する必要があると思います。この場合、MyBSTオブジェクトを別のスレッドの下に配置します。

メインアプリケーションで、すべてのBST操作を処理する新しいスレッドを作成します。

QThread * BSTThread = new QThread();
BSTThread->start();

BSTThreadは、独自のイベントキューを持つ新しいスレッドです。次に、MyBSTオブジェクトを作成し、MyBSTがQObjectを継承していることを確認し、オブジェクトでmoveToThreadメソッドを呼び出すことができます。

MyBST * bst = new MyBST();
bst->moveToThread(BSTThread);

メインアプリケーションがMyBSTと通信する場合、メインアプリケーションから信号を送信します。Qt :: QueuedConnectionを使用して信号をMyBSTクラスのスロットに接続するか、Qt :: AutoConnectionを使用すると、bstオブジェクトがメインアプリとは異なるスレッドに存在するため、自動的にキュー接続され、スロット内の関数はBSTThreadによって実行されます。

また、bstオブジェクトがメインアプリと通信し、シグナルを送信する場合、このシグナルはメインアプリのスロットに接続され、mainThreadで適切に処理されます。このように、通信は非同期であり、bstオブジェクトにリクエストを送信したときにすぐに結果を取得することはできません。これは、リクエストをシグナルとして送信し、処理を待機しているBSTThreadのイベントキューにポストされるためです。BSTThreadはメインアプリからのリクエストを処理した後、結果をメインスレッドのイベントキューにポストバックし、メインスレッドが結果を処理してGUIを更新します。

詳細を知りたい場合は、QTでこのhttp://doc.qt.digia.com/qt/thread-basics.htmlを読む必要があると思います。

于 2012-11-24T05:57:56.450 に答える
0

MyBSTメンバーを宣言するウィンドウを作成するだけです。

class MyBST;

class ChocAnGui
    : public QMainWindow
{
    Q_OBJECT

 public:
   ChocAnGui(MyBST* aBst = 0, QWidget *parent = 0);
   MyBST *bst

次に、オブジェクトで初期化します。

ChocAnGui *gui = new ChocAnGui(bst);

または、それをメンバーにすることはできず、GUIに常にMyBSTポインターをとらせることができます。

class MyBST;

class ChocAnGui
    : public QMainWindow
{
    Q_OBJECT

 public:
   ChocAnGui(QWidget *parent = 0);
   void doSomething(MyBST*);
于 2012-11-24T00:17:00.423 に答える