9. Qt-Dialogfeld

1. Grundkonzepte von Dialogfeldern

Dialogfelder sind ein integraler Bestandteil von GUI-Programmen. Viele Funktionskomponenten, die nicht für die Platzierung im Hauptfenster geeignet sind oder nicht geeignet sind, müssen im Dialogfenster eingestellt werden. Ein Dialogfeld ist normalerweise ein Fenster der obersten Ebene, das oben im Programm angezeigt wird und zur Implementierung kurzfristiger Aufgaben oder einfacher Benutzerinteraktionen verwendet wird.

Qt verwendet die Klasse QDialog, um Dialogfelder zu implementieren. Genau wie das Hauptfenster entwerfen wir normalerweise eine Klasse, die QDialog erbt. QDialog (und seine Unterklassen sowie alle Klassen vom Typ Qt::Dialog) haben zusätzliche Erklärungen für ihre übergeordneten Zeiger: Wenn parent NULL ist, fungiert das Dialogfeld als Fenster der obersten Ebene, andernfalls fungiert es als übergeordnete Komponente. Untergeordnetes Dialogfeld (derzeit ist die Standardposition die Mitte des übergeordneten Dialogfelds). Der Unterschied zwischen Fenstern der obersten Ebene und Fenstern, die nicht zur obersten Ebene gehören, besteht darin, dass Fenster der obersten Ebene ihre eigene Position in der Taskleiste haben, während Fenster, die nicht zur obersten Ebene gehören, die Position ihrer übergeordneten Komponenten teilen.

Dialogfelder werden in modale Dialogfelder und nichtmodale Dialogfelder unterteilt.

  • Ein modales Dialogfeld blockiert Eingaben aus anderen Fenstern in derselben Anwendung.

Modale Dialoge sind weit verbreitet, beispielsweise die Funktion „Datei öffnen“. Sie können versuchen, eine Datei im Editor zu öffnen. Wenn das Dialogfeld „Datei öffnen“ angezeigt wird, können wir keine anderen Fensterteile als dieses Dialogfeld bearbeiten.

  • Das Gegenteil ist ein nichtmodales Dialogfeld, beispielsweise das Suchdialogfeld. Wir können den Inhalt des Notizblocks weiter bearbeiten, während das Suchdialogfeld angezeigt wird.

2. Standarddialogfeld

Die sogenannten Standarddialogfelder sind eine Reihe von in Qt integrierten Dialogfeldern, um die Entwicklung zu vereinfachen. Tatsächlich gibt es viele gängige Dialogfelder, z. B. zum Öffnen von Dateien, zum Festlegen von Farben, zum Drucken von Einstellungen usw. Diese Dialogfelder sind in allen Programmen nahezu identisch, sodass nicht in jedem Programm ein solches Dialogfeld implementiert werden muss.

Die integrierten Dialogfelder von Qt sind grob in die folgenden Kategorien unterteilt:

  • QColorDialog: Farbe auswählen;
  • QFileDialog: Wählen Sie eine Datei oder ein Verzeichnis aus;
  • QFontDialog: Schriftart auswählen;
  • QInputDialog: Ermöglicht dem Benutzer die Eingabe eines Werts und gibt seinen Wert zurück.
  • QMessageBox: Modales Dialogfeld, das zum Anzeigen von Informationen, zum Stellen von Fragen usw. verwendet wird;
  • QPageSetupDialog: Bietet papierbezogene Optionen für den Drucker;
  • QPrintDialog: Druckerkonfiguration;
  • QPrintPreviewDialog: Druckvorschau;
  • QProgressDialog: Zeigt den Vorgangsprozess an.

3. Benutzerdefiniertes Nachrichtenfeld

Qt unterstützt modale und modale Dialogfelder.

Modale und nichtmodale Implementierung:

  • Verwenden von QDialog::exec() zum Implementieren modaler Dialogfelder auf Anwendungsebene
  • Verwenden Sie QDialog::open(), um modale Dialogfelder auf Fensterebene zu implementieren
  • Verwenden Sie QDialog::show(), um ein modales Dialogfeld zu implementieren.

3.1. Modales Dialogfeld

Qt verfügt über zwei Ebenen modaler Dialoge:

  • Modalitäten auf Anwendungsebene

Wenn dieses modale Dialogfeld angezeigt wird, muss der Benutzer zunächst mit dem Dialogfeld interagieren, bis das Dialogfeld geschlossen wird, und kann dann auf andere Fenster im Programm zugreifen.

  • Modal auf Fensterebene

Dieses Modal blockiert nur das mit dem Dialogfeld verknüpfte Fenster, ermöglicht dem Benutzer jedoch weiterhin die Interaktion mit anderen Fenstern im Programm. Modalitäten auf Fensterebene eignen sich besonders für den Mehrfenstermodus.

Der allgemeine Standard ist die Modalität auf Anwendungsebene.

Im folgenden Beispiel rufen wir exec() auf, um das Dialogfeld anzuzeigen. Es handelt sich also um ein modales Dialogfeld. Wenn ein Dialogfeld angezeigt wird, können wir erst dann mit dem Hauptfenster interagieren, wenn wir das Dialogfeld schließen.

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

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

Der Effekt ist wie folgt:

Sie können nicht mit anderen Fenstern interagieren, wenn das modale Dialogfeld nicht geschlossen ist.

Hier ist die Yuque-Videokarte. Klicken Sie zum Anzeigen auf den Link: modal.mp4

3.2. Modeless-Dialogfeld

Als nächstes versuchen wir, exec() in show() zu ändern, um das nichtmodale Dialogfeld anzuzeigen:

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

Aber das Dialogfeld blitzte vorbei! Dies liegt daran, dass die Funktion show() den aktuellen Thread nicht blockiert, das Dialogfeld angezeigt wird und die Funktion dann sofort zurückkehrt und die Ausführung des Codes fortsetzt. Beachten Sie, dass der Dialog auf dem Stapel erstellt wird, die Funktion show() zurückkehrt, die Funktion MainWindow::open() endet und der Dialog über den Gültigkeitsbereich hinaus zerstört wird, sodass das Dialogfeld verschwindet.

Also haben wir den Dialog so geändert, dass er auf dem Heap erstellt wird, und natürlich ist dieses Problem verschwunden:

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

Wenn Sie vorsichtig genug sind, sollten Sie feststellen, dass im obigen Code ein Problem vorliegt: Der Dialog weist einen Speicherverlust auf! Der Dialog verwendet new, um Speicherplatz auf dem Heap zuzuweisen, wurde jedoch nie gelöscht.

In diesem Szenario können wir das WindowAttribute des Dialogs festlegen:

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

Die Funktion setAttribute() zerstört das Dialogfeld automatisch, wenn das Dialogfeld geschlossen wird.

Der Effekt ist wie folgt:

Wir können auch mit anderen Fenstern interagieren, wenn das nichtmodale Dialogfeld nicht geschlossen ist.

Hier ist die Yuque-Videokarte. Klicken Sie zum Anzeigen auf den Link: non-modal.mp4

4. Nachrichtendialogfeld (modal)

QMessageBox wird zum Anzeigen von Nachrichtenaufforderungen verwendet. Im Allgemeinen verwenden wir mehrere von ihm bereitgestellte statische Funktionen:

4.1. Über-Dialogfeld

Dies ist das einfachste Dialogfeld. Das übergeordnete Fenster ist übergeordnetes Fenster, der Titel ist Titel und der Inhalt ist Text. Das Dialogfeld verfügt nur über eine Schaltfläche „OK“.

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

Der Effekt ist wie folgt:

4.2. Über Qt-Dialogfelder

In diesem Dialogfeld werden Informationen zu Qt angezeigt.

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

Der Effekt ist wie folgt:

4.3. Fehlerdialogfeld

In diesem Dialogfeld wird ein rotes Fehlersymbol angezeigt. Wir können die angezeigten Schaltflächen über den Buttons-Parameter angeben. Standardmäßig gibt es nur eine Schaltfläche „OK“. Wir können den Typ „StandardButtons“ verwenden, um mehrere Schaltflächen anzugeben.

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

Der Effekt ist wie folgt:

4.4. Informationsdialog

Ähnlich wie QMessageBox::critical(), außer dass dieses Dialogfeld ein normales Nachrichtensymbol bereitstellt.

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

Der Effekt ist wie folgt:

4.5. Fragedialogfeld

Ähnlich wie QMessageBox::critical(), außer dass dieses Dialogfeld ein Fragezeichensymbol enthält und die angezeigten Schaltflächen „Ja“ und „Nein“ sind.

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

Der Effekt ist wie folgt:

4.6. Dialogfeld „Warnung“.

Ähnlich wie QMessageBox::critical(), außer dass dieses Dialogfeld ein gelbes Ausrufezeichensymbol enthält.

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

Der Effekt ist wie folgt:


5. Andere Dialogfelder

5.1. Farbdialogfeld

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

Der Effekt ist wie folgt:

5.2. Datei-Dialogfeld

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

Der Effekt ist wie folgt:

5.3. Dialogfeld „Schriftart“.

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

Der Effekt ist wie folgt:


6. Referenzprogrammdateien

03_QDialog.zip

Supongo que te gusta

Origin blog.csdn.net/qq_63388834/article/details/135140790
Recomendado
Clasificación