Относительно недавно (пару месяцев назад) я разработал небольшой шаблон, который упрощает жизнь тем нашим читателям, кто после ряда публикаций в нашем блоге активно начал работу с замечательной библиотекой QtE5.
Данный шаблон упрощает создание основной процедуры main, автоматически создавая ее со всеми нужными вспомогательными процедурами и нужным активным классом основного виджета, который принимается шаблоном в качестве аргумента.
В описываемом мной шаблоне нет ничего экстраординарного и необычного, поскольку его содержимое достаточно стандартно и рассматривается практически в каждой статье блога, где мы рассказываем о той или иной разработке на базе QtE5. Однако, частое копирование фрагментов кода, которые содержаться в шаблоне, порядком поднадоело, что привело к созданию QtE5EntryPoint:
template QtE5EntryPoint(alias mainFormName)
{
import std.string : format;
enum QtE5EntryPoint = format(
`
import core.runtime;
import std.stdio;
auto QtEDebugInfo(bool debugFlag)
{
if (LoadQt(dll.QtE5Widgets, debugFlag))
{
return 1;
}
else
{
return 0;
}
}
int main(string[] args)
{
%1$s mainForm;
QtEDebugInfo(true);
QApplication app = new QApplication(&Runtime.cArgs.argc, Runtime.cArgs.argv, 1);
with (mainForm = new %1$s(null, QtE.WindowType.Window))
{
show;
saveThis(&mainForm);
}
return app.exec;
}
`,
mainFormName.stringof
);
}
Используется QtE5EntryPoint так: сначала создается класс основного виджета приложения (тот класс, который содержит в себе все необходимые элементы приложения), описывается логика приложения и с помощью шаблона QtE5EntryPoint по имени класса основного виджета формируется процедура main.
Создадим простое приложение, используя данный шаблон:
import qte5;
alias WindowType = QtE.WindowType;
alias normalWindow = WindowType.Window;
template QtE5EntryPoint(alias mainFormName)
{
import std.string : format;
enum QtE5EntryPoint = format(
`
import core.runtime;
import std.stdio;
auto QtEDebugInfo(bool debugFlag)
{
if (LoadQt(dll.QtE5Widgets, debugFlag))
{
return 1;
}
else
{
return 0;
}
}
int main(string[] args)
{
%1$s mainForm;
QtEDebugInfo(true);
QApplication app = new QApplication(&Runtime.cArgs.argc, Runtime.cArgs.argv, 1);
with (mainForm = new %1$s(null, QtE.WindowType.Window))
{
show;
saveThis(&mainForm);
}
return app.exec;
}
`,
mainFormName.stringof
);
}
extern(C)
{
void onLoadButton(MainForm* mainFormPointer)
{
(*mainFormPointer).runPressButton;
}
}
class MainForm : QWidget
{
private
{
QVBoxLayout box0;
QLabel label0;
QPushButton button0;
}
this(QWidget parent, WindowType windowType)
{
super(parent, windowType);
setWindowTitle("QtE5 Empty Project");
box0 = new QVBoxLayout(null);
label0 = new QLabel(null);
button0 = new QPushButton("Start !", this);
QAction action0 = new QAction(this, &onLoadButton, aThis);
connects(button0, "clicked()", action0, "Slot()");
box0
.addWidget(label0)
.addWidget(button0);
setMinimumSize(200,200);
setMaximumSize(200,200);
setLayout(box0);
}
void runPressButton()
{
label0.setText = "---->";
}
}
mixin(QtE5EntryPoint!MainForm);
Как видите, все очень и очень просто !
P.S: Данный шаблон теперь официально входит в состав QtE5, так что теперь вам не нужно определять данный шаблон отдельно.