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();
効果は次のとおりです。