Как создать окно в QT без использования формы?

Мне нужно создать окно, но без ui формы, то есть только с помощью кода. Как это можно сделать?


Ответы (1 шт):

Автор решения: Maxim Timakov

Создаете widget, добавляете к нему layout, на layout добавляете виджеты и дочерние лайоуты.

Как это делается вы можете посмотреть в сгенерированном для "формы" заголовочном файле перейдя к реализации ui->setupUi(this) (обычно Ctrl+Click на setupUi)

Первый попавшийся пример из моих исходников:

# list_model.pro
QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11 warn_on

TARGET = list_model
TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS


SOURCES += main.cpp\
        mainview.cpp

HEADERS  += mainview.h
//main.cxx
#include "mainview.hxx"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainView w;
    w.show();

    return a.exec();
}
// mainview.hxx
#ifndef MAINVIEW_H
#define MAINVIEW_H

#include <QtWidgets>

class MainView : public QWidget
{
    Q_OBJECT

public:
    MainView(QWidget *parent = 0);
    ~MainView();
private:
};

#endif // MAINVIEW_H
// mainview.cxx
#include "mainview.hxx"

MainView::MainView(QWidget *parent)
    : QWidget(parent)
{
    const auto iconSize = QSize(100, 100);
    auto mainBox = new QVBoxLayout();
    auto bottomBox  = new QHBoxLayout();
    auto clearBtn  = new QPushButton("clear");
    auto selectBtn = new QPushButton("select");

    auto view = new QListWidget();
    view->setIconSize(iconSize);
    view->setViewMode(QListView::IconMode);
    view->setResizeMode(QListView::ResizeMode::Adjust);

    connect(clearBtn, &QPushButton::clicked, view, &QListWidget::clear);

    connect(selectBtn, &QPushButton::clicked, [view, iconSize]() -> void
    {
        QStringList files = QFileDialog::getOpenFileNames(0,"","","*.png *.jpg");
        for(auto& file : files)
        {
            auto item = new QListWidgetItem("", view);
            auto image = QPixmap(file).scaled(iconSize, Qt::AspectRatioMode::KeepAspectRatio);
            item->setIcon(image);
        }
    });

    bottomBox->addWidget(clearBtn, 0, Qt::AlignLeft);
    bottomBox->addWidget(selectBtn, 0, Qt::AlignRight);

    mainBox->addWidget(view);
    mainBox->addLayout(bottomBox);
    setLayout(mainBox);
}

MainView::~MainView()
{

}
→ Ссылка