Using Qt’s Built-in Dialogs: Font, Progress, and Print Pickers

Font Selection Dialog

The QFontDialog widget lets users pick a typeface and its attributes at run time. Typical workflow:

  1. Create the dialog.
  2. Seed it with an initial font.
  3. Show it modally and read the chosen font if the user accepts.
void pickFont()
{
    QFontDialog dlg;
    dlg.setWindowTitle("Font Picker");
    dlg.setCurrentFont(QFont("Consolas", 11, QFont::DemiBold));

    if (dlg.exec() == QDialog::Accepted)
        qDebug() << "Chosen font:" << dlg.selectedFont();
}

Progress Feedback Dialog

QProgressDialog keeps the user informed during lengthy operasions. Key properties:

  • minimum and maximum define the range.
  • setValue() moves the bar.
  • Call exec() for a blocking dialog or show() for non-blocking use.
void simulateDownload()
{
    QProgressDialog dlg("Downloading...", "Cancel", 0, 100);
    dlg.setWindowModality(Qt::ApplicationModal);

    for (int step = 0; step <= 100; ++step)
    {
        dlg.setValue(step);
        QThread::msleep(50);          // real work goes here
        if (dlg.wasCanceled()) break;
    }
}

Print Setup Dialog

QPrintDialog surfaces printer options and returns a configured QPrinter object. A minimal print routine:

void printDocument()
{
    QPrintDialog dlg;
    if (dlg.exec() != QDialog::Accepted) return;

    QPrinter *printer = dlg.printer();
    printer->setOutputFileName("D:/greetings.pdf");

    QTextDocument doc;
    doc.setPlainText("Hello, Qt!");
    doc.print(printer);
}

Complete Example

The following program shows all three dialogs from a single window.

// main.cpp
#include <QApplication>
#include "mainwidget.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWidget w;
    w.show();
    return app.exec();
}
// mainwidget.h
#pragma once
#include <QWidget>
#include <QPushButton>

class MainWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MainWidget(QWidget *parent = nullptr);

private slots:
    void onFontClicked();
    void onProgressClicked();
    void onPrintClicked();

private:
    QPushButton m_fontBtn  {"Font"};
    QPushButton m_progBtn {"Progress"};
    QPushButton m_printBtn{"Print"};
};
// mainwidget.cpp
#include "mainwidget.h"
#include <QFontDialog>
#include <QProgressDialog>
#include <QPrintDialog>
#include <QPrinter>
#include <QTextDocument>
#include <QThread>
#include <QVBoxLayout>
#include <QDebug>

MainWidget::MainWidget(QWidget *parent) : QWidget(parent)
{
    setFixedSize(220, 150);
    auto *lay = new QVBoxLayout(this);
    lay->addWidget(&m_fontBtn);
    lay->addWidget(&m_progBtn);
    lay->addWidget(&m_printBtn);

    connect(&m_fontBtn,  &QPushButton::clicked, this, &MainWidget::onFontClicked);
    connect(&m_progBtn,  &QPushButton::clicked, this, &MainWidget::onProgressClicked);
    connect(&m_printBtn, &QPushButton::clicked, this, &MainWidget::onPrintClicked);
}

void MainWidget::onFontClicked()
{
    bool ok = false;
    QFont f = QFontDialog::getFont(&ok, QFont("Arial", 10), this);
    if (ok) qDebug() << "Selected:" << f;
}

void MainWidget::onProgressClicked()
{
    QProgressDialog dlg("Processing...", "Abort", 0, 100, this);
    dlg.setWindowModality(Qt::WindowModal);

    for (int i = 0; i <= 100; ++i)
    {
        dlg.setValue(i);
        if (dlg.wasCanceled()) break;
        QThread::msleep(30);
    }
}

void MainWidget::onPrintClicked()
{
    QPrintDialog dlg(this);
    if (dlg.exec() == QDialog::Accepted)
    {
        QPrinter *p = dlg.printer();
        p->setOutputFileName("D:/demo.pdf");
        QTextDocument doc;
        doc.setHtml("<h1>Qt Print Test</h1><p>Success!</p>");
        doc.print(p);
    }
}

Tags: Qt QFontDialog QProgressDialog QPrintDialog QPrinter

Posted on Mon, 05 Oct 2026 16:20:49 +0000 by Dan Coates