The native GTK print dialog has a preview button, but you may also start a preview directly from an application:

// in a class that inherits from Gtk::Window...
auto op = PrintOperation::create();
// ...set up op...
op->run(Gtk::PrintOperation::Action::PREVIEW, *this);

On Unix, the default preview handler uses an external viewer program. On Windows, the native preview dialog will be shown. If necessary you may override this behavior and provide a custom preview dialog. See the example located in /examples/book/printing/advanced.