2

私はQTではかなり新しいです。以下は、qt docs からかなり簡単に説明しています。

class CalculatorForm : public QWidget
 {
     Q_OBJECT
 public:
     CalculatorForm(QWidget *parent = 0);
 private slots:
     void on_inputSpinBox1_valueChanged(int value); //why is that slots are private?
 private:
     Ui::CalculatorForm ui;
 };

とコンストラクタの実装

 CalculatorForm::CalculatorForm(QWidget *parent)
     : QWidget(parent) {
     ui.setupUi(this); // <-- Question below
 }

Q: なぜthissetupUi 関数にポインターを渡すのですか?

4

5 に答える 5

4

ダイアログが呼び出し元を親として持つように、たとえば親が閉じられたときにダイアログを自動的に閉じることができるようにします。通常、すべての gui 要素には、親へのポインターがあります。

 private slots:
     void on_inputSpinBox1_valueChanged(int value); //why is that slots are private?

これらは、QtDesigner のガイドの名前と完全に一致する自動生成スロットです。これらは、これらの gui 要素に直接接続することのみを目的としているため、このクラスで処理する必要があります。これらのシグナルが他のクラスに拡張された場合、GUI を変更すると、GUI の詳細を知る必要のない他の多くのコードを変更する必要があります。

特定の gui 要素のハンドラー スロットで、アプリの残りの部分に別のより一般的なシグナルを送信できます。

于 2012-08-29T15:23:44.573 に答える
2

The only widget that setupUi doesn't create is the widget at the top of the hierarchy in the ui file, and as the Ui::CalculatorForm class instance doesn't know the widget it has to fill, it (this) has to be passed explicitly to the class at some point.

this or any other widget you would pass to it, is used as the parent to all other subwidgets. For example, you could fill a widget without inheritance like this:

QWidget *widget = new QWidget;
Ui::CalculatorForm *ui = new Ui::CalculatorForm;
ui->setupUi(widget);
widget->show();

But really, it would be easier to understand if you read the content of the uic generated file (probably named ui_calculatorform.h).

于 2012-08-29T16:09:57.327 に答える
1

setupUi は、ウィジェット (QLabel、QTextEdit など) のインスタンスを作成します。[ユーザー インターフェイス コンパイラ] (http://qt-project.org/doc/qt-4.8/uic.html) は、.UI フォームから情報を取得し、生成された moc ソース ファイルにウィジェット作成コードを生成します。

Qt Designer または UI ファイルを使用せずにウィジェットを手動で作成する方法は次のようになります。

QWidget* pWidget = new QWidget(this);

于 2012-08-29T15:28:40.740 に答える
0

デザイナーがコードを自動生成する別の方法があることに注意してください。この場合、このコードには QObject ではない別の「UI」クラスがあるため、QWidget でもありません。自動生成されたコードには、親ウィジェットに関する情報と、スロットとシグナルの自動接続を作成するための情報が必要なので、渡す必要がありますthis
このパターは、他のパターンよりも邪魔になりません (これがデフォルトの理由です)。別のパターンを試すこともできます (Qt Creator Designer のオプションを確認してください) が、既定の設定でデザイナー ツールによって生成されるものを確認することをお勧めします。

于 2012-08-29T15:38:42.027 に答える
0

このUIのレイアウトに呼び出し元ウィジェットを追加することだと思います。このウィジェットがトップレベルのウィジェットになります。

Martin Beckett の回答も正しいかもしれません。彼が説明したのは Qt の一般的な動作です (ほとんどのウィジェットの派生クラス コンストラクターの「parent」引数を参照)。

于 2012-08-29T15:27:49.310 に答える