Dialog-Objekt

Ein Dialog wird über die Methode ​QDialog::open()​ angezeigt. Es stehen je nach verwendeter Subklasse mehrere Signale zur Verfügung, über die das Ergebnis des Dialogs verarbeitet werden kann.

Als Beispiel soll eine Art Todo-Liste erstellt werden, bei der über einen Dialog Einträge hinzugefügt und wieder gelöscht werden können. Dazu erstellen wir zuerst ein Objekt der Klasse QInputDialog und rufen danach dessen QDialog::open()-Methode auf. Über textValueSelected() wird der ausgewählte Text abgefragt.

main.cpp
#include <QApplication>
#include "MessageListWidget.h"
 
int main ( int argc, char *argv[] )
{
  QApplication app( argc, argv );
  MessageListWidget w;
 
  w.show();
 
  return app.exec();
}
MessageListWidget.h
#ifndef MESSAGELISTWIDGET_H
#define MESSAGELISTWIDGET_H
 
#include <QWidget>
 
class QListWidget;
class QPushButton;
class QInputDialog;
 
class MessageListWidget : public QWidget
{
 
    Q_OBJECT
 
  public:
    MessageListWidget();
 
  private:
    QListWidget *messageList;               // Liste aus Texten
    QPushButton *addButton, *removeButton;  // Buttons zum Hinzufügen und Löschen
    QInputDialog *dialog;                   // Dialog zur Eingabe von Text
 
  private slots:
    void showInputDialog();
    void addMessage( const QString& text );
    void removeSelectedMessage();
 
};
 
#endif // MESSAGELISTWIDGET_H
MessageListWidget.cpp
#include "MessageListWidget.h"
#include <QPushButton>
#include <QListWidget>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QInputDialog>
#include <QList>
 
MessageListWidget::MessageListWidget()
  : messageList( new QListWidget() ),
    addButton( new QPushButton ("+" ) ),
    removeButton( new QPushButton( "-" ) ),
    dialog( new QInputDialog() )
{
  QVBoxLayout *vLayout = new QVBoxLayout();
  QHBoxLayout *hLayout = new QHBoxLayout();
 
  // Es kann nur ein Element der Liste selektiert werden.
  messageList->setSelectionMode( QAbstractItemView::SingleSelection );
  // Der Dialog bekommt text als Eingabe und ist modal
  dialog->setInputMode( QInputDialog::TextInput );
  dialog->setModal( true );
  dialog->setWindowTitle( "Neuer Eintrag" );
 
  // Verbindungen aufbauen
  connect( addButton, &QPushButton::clicked,
           this, &MessageListWidget::showInputDialog );
  connect( removeButton, &QPushButton::clicked,
           this, &MessageListWidget::removeSelectedMessage );
  connect( dialog, &QInputDialog::textValueSelected,
           this, &MessageListWidget::addMessage );
 
  // Widgets in Layout einfügen
  hLayout->addStretch();
  hLayout->addWidget( addButton );
  hLayout->addWidget( removeButton );
  vLayout->addWidget( messageList );
  vLayout->addLayout( hLayout );
 
  setWindowTitle( "Todo" );
  setLayout( vLayout );
  resize( 400, 400 );
}
 
 
void MessageListWidget::showInputDialog()
{
  // Dialog zurücksetzen und anzeigen
  dialog->setTextValue( "" );
  dialog->open();
}
 
 
void MessageListWidget::addMessage( const QString& text )
{
  // Text in die Liste einfügen, wenn er nicht nur aus Whitespaces besteht
  if( text.trimmed().size() > 0 )
    messageList->addItem( text );
}
 
 
void MessageListWidget::removeSelectedMessage()
{
  // Ausgewähltes Objekt aus der Liste löschen (es kann immer nur 1 Objekt gelöscht werden)
  QList<QListWidgetItem *> items = messageList->selectedItems();
  delete items.first();
}