понедельник, 24 марта 2014 г.

Qt: Стандартные диалоговые окна

В Qt имеются классы таких стандартных диалоговых окон:
  1. QColorDialog - Диалоговое окно для задания цвета.
  2. QErrorMessage - Диалоговое окно ошибки.
  3. QFileDialog - Диалог для выбора файла, или каталога.
  4. QFontDialog - Диалог для выбора шрифта.
  5. QInputDialog - Диалог ввода значения.
  6. QMessageBox - Диалоговые сообщения.
  7. QPrintDialog - Диалог вывода на печать.
  8. QProgressDialog - Обратная связь с индикатором выполнения во время длительного процесса.

Заметка! Для того, чтобы все элементы диалоговых окон были локализованы, необходимо загрузить системную локаль. Сделать это можно с помощью следующего кода в файле main.cpp:

...
#include <QTranslator>
#include <QLocale>
#include <QLibraryInfo>
...
QApplication app(argc, argv);

QString translatorFileName = QLatin1String("qt_");
translatorFileName += QLocale::system().name();
QTranslator *translator = new QTranslator(&app);
if (translator->load(translatorFileName, QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
    app.installTranslator(translator);

MainWindow w;
w.show();
    
return app.exec();

1. Диалоговое окно для задания цвета

Вызов окна осуществляется следующим образом:
#include <QtGui>
...
QColor color = QColorDialog::getColor(Qt::red, this);
if ( color.isValid() ){
  ...
}

2. Диалоговое окно ошибки

Вывод сообщения об ошибке в специальном окошке:
#include <QtGui>
...
QErrorMessage errorMessage;
errorMessage.showMessage("Testing Error message");
errorMessage.exec();

3. Диалог для выбора файла, или каталога

  • Сохранение файла:
    #include <QtGui>
    ...
    QString fileName = QFileDialog::getSaveFileName(this, 
                                QString::fromUtf8("Сохранить файл"),
                                QDir::currentPath(),
                                "Images (*.png *.xpm *.jpg);;All files (*.*)");
    
  • Открытие одного файла:
    #include <QtGui>
    ...
    QString fileName = QFileDialog::getOpenFileName(this, 
                                QString::fromUtf8("Открыть файл"),
                                QDir::currentPath(),
                                "Images (*.png *.xpm *.jpg);;All files (*.*)");
    
  • Открытие нескольких файла:
    #include <QtGui>
    ...
    QStringList files = QFileDialog::getOpenFileNames(this,
                                QString::fromUtf8("Выберите один, или более файлов"),
                                QDir::currentPath(),
                                "Images (*.png *.xpm *.jpg);;All files (*.*)");
    
  • Открытие каталога:
    #include <QtGui>
    ...
    QString dir = QFileDialog::getExistingDirectory(this, 
                               QString::fromUtf8("Открыть папку"),
                               QDir::currentPath(),
                               QFileDialog::ShowDirsOnly
                               | QFileDialog::DontResolveSymlinks);
    

4. Диалог для выбора шрифта

#include <QtGui>
...
bool ok;
QFont font = QFontDialog::getFont(&ok, QFont("Times", 12), this, QString::fromUtf8("Выберите шрифт"));
if (ok) {
    // устанавливается выбранный пользователем шрифт
} else {
    // Пользователь нажал кнопку "Cancel"; Устанавливается начальный шрифт. 
    //В данном случае Times, 12.
}

5. Диалог ввода значения

  • Ввод дробного числа:
    #include <QtGui>
    ...
    bool ok;
    double d = QInputDialog::getDouble(this,
                              QString::fromUtf8("Введите сумму"),
                              QString::fromUtf8("Сумма:"), 
                              0.00, -10000, 10000, 3, &ok);
    if (ok){
        ui->listWidget->clear();
        ui->listWidget->addItem(QString::fromUtf8("%1 денег").arg(d));
    }
    
    Параметры метода getDouble() по порядку: (1) родительский виджет, (2) заголовок диалогового окна, (3) надпись над полем ввода, (4) стартовое значение, (5) минимальное значение, (6) максимальное значение, (7) количество знаков после запятой, (8) если была нажата кнопка Cancel, то false, иначе - true.
  • Ввод целого числа:
    #include <QtGui>
    ...
    bool ok;
    int i = QInputDialog::getInt(this, QString::fromUtf8("Введите процент"),
                             QString::fromUtf8("Процент:"), 25, 0, 100, 1, &ok);
    if (ok){
        ui->listWidget->clear();
        ui->listWidget->addItem(QString::fromUtf8("%1%").arg(i));
    }
    
  • Ввод текста:
    #include <QtGui>
    ...
    bool ok;
    QString text = QInputDialog::getText(this, 
                                 QString::fromUtf8("Введите текст"),
                                 QString::fromUtf8("Ваш текст:"), 
                                 QLineEdit::Normal,
                                 QDir::home().dirName(), &ok);
    if (ok && !text.isEmpty()){
        ui->listWidget->clear();
        ui->listWidget->addItem(QString::fromUtf8("%1").arg(text));
    }
    
  • Выбор значения из списка:
    #include <QtGui>
    ...
    QStringList items;
    items << QString::fromUtf8("Весна") << QString::fromUtf8("Лето")
          << QString::fromUtf8("Осень") << QString::fromUtf8("Зима");
    
    bool ok;
    QString item = QInputDialog::getItem(this,
                             QString::fromUtf8("Выберите сезон"),
                             QString::fromUtf8("Сезон:"), items, 1, false, &ok);
    if (ok && !item.isEmpty()){
        ui->listWidget->clear();
        ui->listWidget->addItem(item);
    }
    
    Параметры метода getItem() по порядку: (1) родительский виджет, (2) заголовок диалогового окна, (3) надпись над списком выбора, (4) список значений, (5) начальный элемент, (6) редактируемый список, (7) если была нажата кнопка Cancel, то false, иначе - true.

6. Диалоговые сообщения

  • Окно About:
    #include <QtGui>
    ...
    QMessageBox::about(this, "Title", "Text");
    
  • Окно About Qt:
    #include <QtGui>
    ...
    QMessageBox::aboutQt(this, "Title About Qt");
    
  • Критические сообщения:
    #include <QtGui>
    ...
    QMessageBox::StandardButton reply;
    reply = QMessageBox::critical(this, QString::fromUtf8("Критическая ошибка"),
                          QString::fromUtf8("Сообщение при критической ошибке"),
                          QMessageBox::Abort | QMessageBox::Retry | QMessageBox::Ignore);
    ui->listWidget->clear();
    switch (reply){
    case QMessageBox::Abort:
        ui->listWidget->addItem("Abort");
        break;
    case QMessageBox::Retry:
        ui->listWidget->addItem("Retry");
        break;
    case QMessageBox::Ignore:
        ui->listWidget->addItem("Ignore");
        break;
    default:
        break;
    }
    
  • Информативные сообщения:
    #include <QtGui>
    ...
    QMessageBox::StandardButton reply;
    reply = QMessageBox::information(this,
                           QString::fromUtf8("Сообщение"),
                           QString::fromUtf8("Информативное сообщение"));
    ui->listWidget->clear();
    if (reply == QMessageBox::Ok)
        ui->listWidget->addItem("Ok");
    else
        ui->listWidget->addItem("Escape");
    
  • Вопросительные сообщения:
    #include <QtGui>
    ...
    QMessageBox::StandardButton reply;
    reply = QMessageBox::question(this, QString::fromUtf8("Сообщение"),
                          QString::fromUtf8("Здесь текст вопроса"),
                          QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
    ui->listWidget->clear();
    if (reply == QMessageBox::Yes)
        ui->listWidget->addItem("Yes");
    else if (reply == QMessageBox::No)
        ui->listWidget->addItem("No");
    else
        ui->listWidget->addItem("Cancel");
    
  • Предупредительные сообщения:
    #include <QtGui>
    ...
    QMessageBox msgBox(QMessageBox::Warning,
                       QString::fromUtf8("Предупреждение"),
                       QString::fromUtf8("Будьте осторожны..."),
                       0, this);
    msgBox.addButton(QString::fromUtf8("&Сохранить снова"),
                     QMessageBox::AcceptRole);
    msgBox.addButton(QString::fromUtf8("&Продолжить"),
                     QMessageBox::RejectRole);
    ui->listWidget->clear();
    if (msgBox.exec() == QMessageBox::AcceptRole)
        ui->listWidget->addItem("Save Again");
    else
        ui->listWidget->addItem("Continue");
    

7. Диалог вывода на печать

#include <QtGui>
...
QPrinter printer;
QPrintDialog printDialog(&printer, this);
if (printDialog.exec() == QDialog::Accepted) {
    // print ...
}

8. Обратная связь с индикатором выполнения во время длительного процесса

Пример использования класса QProgressDialog представлен ниже:
#include <QtGui>
...
// Operation constructor
Operation::Operation(QObject *parent)
    : QObject(parent), steps(0)
{
    pd = new QProgressDialog("Operation in progress.", "Cancel", 0, 100);
    connect(pd, SIGNAL(canceled()), this, SLOT(cancel()));
    t = new QTimer(this);
    connect(t, SIGNAL(timeout()), this, SLOT(perform()));
    t->start(0);
}

void Operation::perform()
{
    pd->setValue(steps);
    //... perform one percent of the operation
    steps++;
    if (steps > pd->maximum())
        t->stop();
}

void Operation::cancel()
{
    t->stop();
    //... cleanup
}
Удачи!

3 комментария:

  1. Отлично! Все ясно и читабельно! Благодаря Вам я сдам преддипломную практику и главное узнаю полезные фишечки!

    ОтветитьУдалить
  2. Все очень доступно и понятно! Прозрачный код, спасибо!
    Как всегда радуют возможности Qt!

    ОтветитьУдалить