9.Qtダイアログボックス

1. ダイアログボックスの基本概念

ダイアログ ボックスは GUI プログラムに不可欠な部分です。メインウィンドウに配置できない、または配置に適さない機能コンポーネントの多くは、ダイアログボックスで設定する必要があります。ダイアログ ボックスは通常、プログラムの最上部に表示されるトップレベル ウィンドウで、短期的なタスクや単純なユーザー インタラクションを実装するために使用されます。

Qt は QDialog クラスを使用してダイアログ ボックスを実装します。メインウィンドウと同様に、通常は QDialog を継承するクラスを設計します。QDialog (およびそのサブクラス、および Qt::Dialog タイプのすべてのクラス) には、親ポインターに関する追加の説明があります。親が NULLの場合、ダイアログ ボックスはトップレベル ウィンドウとして機能し、それ以外の場合は親コンポーネントとして機能します。子ダイアログ ボックス (このときのデフォルトの位置は親の中心です)。トップレベル ウィンドウと非トップレベル ウィンドウの違いは、トップレベル ウィンドウはタスク バー上で独自の場所を持ちますが、非トップレベル ウィンドウは親コンポーネントの場所を共有することです。

ダイアログ ボックスは、モーダル ダイアログ ボックスと非モーダル ダイアログ ボックスに分けられます。

  • モーダル ダイアログ ボックスは、同じアプリケーション内の他のウィンドウからの入力をブロックします。

「ファイルを開く」機能など、モーダル ダイアログ ボックスが一般的です。メモ帳でファイルを開いてみると、「ファイルを開く」ダイアログが表示されるため、このダイアログ以外のウィンドウ部分は操作できません。

  • その反対は、検索ダイアログ ボックスなどの非モーダル ダイアログ ボックスで、検索ダイアログ ボックスが表示されている間、メモ帳の内容の編集を続けることができます。

2. 標準ダイアログボックス

いわゆる標準ダイアログ ボックスは、開発を簡素化するために Qt に組み込まれた一連のダイアログ ボックスです。実際、ファイルを開く、色の設定、印刷設定など、一般的なダイアログ ボックスが多数あります。これらのダイアログ ボックスはすべてのプログラムでほぼ同一であるため、各プログラムでこのようなダイアログ ボックスを実装する必要はありません。

Qt の組み込みダイアログ ボックスは、次のカテゴリに大まかに分類されます。

  • QColorDialog: 色を選択します。
  • QFileDialog: ファイルまたはディレクトリを選択します。
  • QFontDialog: フォントを選択します。
  • QInputDialog: ユーザーが値を入力し、その値を返すことを許可します。
  • QMessageBox: 情報の表示、質問などに使用されるモーダル ダイアログ ボックス。
  • QPageSetupDialog: プリンターの用紙関連のオプションを提供します。
  • QPrintDialog: プリンターの構成。
  • QPrintPreviewDialog: 印刷プレビュー;
  • QProgressDialog: 操作プロセスを表示します。

3. カスタムメッセージボックス

Qt はモーダル ダイアログ ボックスとモードレス ダイアログ ボックスをサポートしています。

モーダル実装と非モーダル実装:

  • QDialog::exec() を使用してアプリケーションレベルのモーダルダイアログボックスを実装する
  • QDialog::open() を使用してウィンドウレベルのモーダルダイアログボックスを実装します
  • QDialog::show() を使用してモードレス ダイアログ ボックスを実装します。

3.1. モーダルダイアログボックス

Qt には 2 つのレベルのモーダル ダイアログがあります。

  • アプリケーションレベルのモーダル

このモーダル ダイアログ ボックスが表示されると、ユーザーはまずダイアログ ボックスが閉じられるまでダイアログ ボックスを操作する必要があり、その後、プログラム内の他のウィンドウにアクセスできるようになります。

  • ウィンドウレベルのモーダル

このモーダルはダイアログ ボックスに関連付けられたウィンドウをブロックするだけですが、ユーザーは引き続きプログラム内の他のウィンドウと対話できます。ウィンドウレベルのモーダルは、マルチウィンドウ モードに特に適しています。

一般的なデフォルトはアプリケーションレベルのモダリティです。

以下の例では、exec() を呼び出してダイアログ ボックスを表示しているため、これはモーダル ダイアログ ボックスです。ダイアログ ボックスが表示されると、ダイアログ ボックスを閉じるまでメイン ウィンドウと対話することはできません。

//点击新建按钮,弹出一个对话框
connect(ui->actionnew,&QAction::triggered,[=](){
    //对话框  分类
    //模态对话框(不可以对其他窗口进行操作)  非模态对话框(可以对其他窗口进行操作)
    //模态创建  阻塞
    QDialog dlg(this);
    dlg.resize(200,100);
    dlg.exec();//以模态的方式创建

    qDebug()<<"模态对话框弹出了";

効果は次のとおりです。

モーダル ダイアログ ボックスが閉じられていない場合、他のウィンドウを操作することはできません。

これが Yuque ビデオ カードです。リンクをクリックして表示します: modal.mp4

3.2. モードレスダイアログボックス

次に、非モーダル ダイアログ ボックスを表示するために exec() を show() に変更してみます。

//非模态对话框
QDialog dlg2 (this);
dlg2->resize(200,100);
dlg2->show();

しかし、ダイアログ ボックスが点滅しました。これは、show() 関数が現在のスレッドをブロックせず、ダイアログ ボックスが表示された後、関数がすぐに戻り、コードの実行が継続されるためです。ダイアログはスタック上に構築され、show() 関数が戻り、MainWindow::open() 関数が終了し、ダイアログがスコープを超えて破棄されるため、ダイアログ ボックスが消えることに注意してください。

そこで、ダイアログをヒープ上に作成するように変更しました。もちろん、この問題は解消されました。

//非模态对话框
QDialog * dlg2 = new QDialog(this);
dlg2->resize(200,100);
dlg2->show();
qDebug()<<"非模态对话框弹开了";

十分に注意していれば、上記のコードに問題があることがわかるはずです。ダイアログにはメモリ リークがあります。ダイアログはヒープ上にスペースを割り当てるために new を使用しますが、削除されたことはありません。

このシナリオでは、ダイアログの WindowAttribute を設定できます。

//非模态对话框
QDialog * dlg2 = new QDialog(this);
dlg2->resize(200,100);
dlg2->show();
dlg2->setAttribute(Qt::WA_DeleteOnClose);//55号 属性
qDebug()<<"非模态对话框弹开了";

setAttribute() 関数は、ダイアログ ボックスが閉じられると、ダイアログ ボックスを自動的に破棄します。

効果は次のとおりです。

モードレス ダイアログ ボックスが閉じていないときは、他のウィンドウと対話することもできます。

こちらが Yuque ビデオ カードです。リンクをクリックして表示します: non-modal.mp4

4. メッセージダイアログボックス(モーダル)

QMessageBox は、メッセージ プロンプトを表示するために使用されます。通常、それが提供するいくつかの静的関数を使用します。

4.1. 「バージョン情報」ダイアログボックス

これは最も単純なダイアログ ボックスで、親ウィンドウはparent、タイトルはtitle、コンテンツはtextです。ダイアログ ボックスには [OK] ボタンが 1 つだけあります。

//消息对话框
//显示关于对话框
QMessageBox::about(this, "对话框", "对话");

効果は次のとおりです。

4.2. Qt ダイアログボックスについて

このダイアログ ボックスは、Qt に関する情報を表示するために使用されます。

//显示关于Qt对话框
QMessageBox::aboutQt(this, "对话框");

効果は次のとおりです。

4.3. エラーダイアログボックス

このダイアログ ボックスには赤いエラー記号が表示されます。表示するボタンは、buttons パラメーターを通じて指定できます。デフォルトでは [OK] ボタンは 1 つだけですが、StandardButtons タイプを使用して複数のボタンを指定できます。

//错误对话框
QMessageBox::critical(this,"critical","错误");

効果は次のとおりです。

4.4. 情報ダイアログ

QMessageBox::critical() と似ていますが、このダイアログ ボックスには通常のメッセージ アイコンが表示される点が異なります。

//信息对话框
QMessageBox::information(this,"info","信息");

効果は次のとおりです。

4.5. 質問ダイアログボックス

QMessageBox::critical() と似ていますが、このダイアログ ボックスには疑問符アイコンが表示され、表示されるボタンが「はい」と「いいえ」である点が異なります。

//提问对话框
//参数1:父亲  参数2:标题  参数3:提示内容  参数4:按键类型  参数5:默认关联回车按键
if(QMessageBox::Save == QMessageBox::question(this,"ques","提问",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel)){
    qDebug()<<"选择的是保存";
}
else{
    qDebug()<<"选择的是取消";
}

効果は次のとおりです。

4.6. 警告ダイアログボックス

QMessageBox::critical() と似ていますが、このダイアログ ボックスには黄色の感嘆符アイコンが表示される点が異なります。

//警告对话框
QMessageBox::warning(this,"waring","警告");

効果は次のとおりです。


5. その他のダイアログボックス

5.1. カラーダイアログボックス

//颜色对话框
QColor color = QColorDialog::getColor(QColor(255,0,0));
qDebug()<<"r = "<<color.red()<<"g = "<<color.green()<<"b = "<<color.blue();

効果は次のとおりです。

5.2. ファイルダイアログボックス

//文件对话框  参数1:父亲  参数2:标题  参数3:默认打开路径  参数4:过滤文件格式
//返回值是  选取的路径
QString str = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\33618\\Desktop","(*.txt)");
qDebug()<<str;

効果は次のとおりです。

5.3. フォントダイアログボックス

//字体对话框
bool flag;
QFont font = QFontDialog::getFont(&flag,QFont("宋体",36));
qDebug()<<"字体:"<<font.family().toUtf8().data()<<"字号:"<<font.pointSize()<<"是否加粗"<<font.bold()<<"是否倾斜"<<font.italic();

効果は次のとおりです。


6. 参考プログラムファイル

03_Qダイアログ.zip

おすすめ

転載: blog.csdn.net/qq_63388834/article/details/135140790