0

私はお互いにメッセージをやり取りする2つのプロセスを持っています。プロセス A は、プロセス B にメッセージを送信する通常の (つまり、qt 以外の) プログラムです。プロセス B は、受信したメッセージをテキスト ボックスに表示する QT GUI アプリケーションです。

QPlainTextEdit から継承し、タイマーが切れたときにパイプからメッセージを読み取り、テキスト ボックスに追加するカスタマイズされたウィジェット (ShowMessages と呼ばれる) を作成しました。コードは実際にはこのように設計されているわけではありませんが (かなり悪い設計だと思います)、単純にするためです。理由はわかりませんが、qt-designer を使用してフォームを作成している間、プロセス A をシャットダウンすることはできません。

問題は、qt デザイナーを使用している間 (つまり、ShowMessages ウィジェットを選択してウィンドウ内に配置している間)、デザイナーにいる場合でも、ウィジェットがメッセージを表示し始めることです。この機能は優れていますが、問題は、フォームを保存すると、既に存在するメッセージが .ui ファイルに保存され、プロセス B を開始したときに不適切な動作が発生することです (プロセスが作成フェーズ中に受信したメッセージを表示し始めるため) .

プロセス B の開始直後にテキスト ボックスを消去することもできましたが、メッセージが .ui ファイルに存在しないようにする方がはるかに優れていると思います。私が望むのは、ウィジェット用に次のようなコードを記述できるようにすることです。

if <I'm not in the designer>
    timer = QtCore.QTimer(self)
    QtCore.QObject.connect(timer, QtCore.SIGNAL("timeout()"), self, QtCore.SLOT("on_timer()"));
    timer.start(2000)

私がデザイナーにいるかどうかを知るためのqt関数はありますか? デザイナー コードとランタイム コードを区別することは「悪い」ことだと思いますか?

(間違いは申し訳ありませんが、英語は私の母国語ではありません)

4

1 に答える 1

1

おそらく、ウィジェットには「アクティブ」であるかどうかのフラグがあり、デフォルトで False に設定されている必要があるため、デザイナーにいる間は何もしません。コードでは、メッセージを見たいときにアクティブに設定します。その後、他のシナリオでもオフにすることができます。

しかし、私が言わなければならないのは、「コントローラー」コードを「ビュー」ウィジェットに入れているように聞こえるということです.

まだ読んでいない場合は、MVC (モデル ビュー コントローラー) デザイン パターンを読むことを検討してください。

アップデート:

公平を期すために、あなたの質問は、あなたがデザイナーであるかどうかを検出する方法を尋ねました:)

http://doc.trolltech.com/4.3/designer-creating-custom-widgets.html#creating-well-behaved-widgets

Qt Designer でカスタム ウィジェットに特別な動作を与えるには、initialize() 関数の実装を提供して、Qt Designer 固有の動作のウィジェット構築プロセスを構成します。この関数は、createWidget() を呼び出す前に初めて呼び出され、後で Qt Designer がプラグインの createWidget() 関数を呼び出すときにテストできる内部フラグを設定できます。

ドキュメントによると、基本的には、ウィジェットの initialize() 関数で「inDesignerFlag」を true に設定できます。次に、ウィジェットのコードで必要な場所でそのフラグを検出します。

于 2009-04-21T17:52:53.390 に答える