Как создать окно в 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()
{
}