Относительно недавно (пару месяцев назад) я разработал небольшой шаблон, который упрощает жизнь тем нашим читателям, кто после ряда публикаций в нашем блоге активно начал работу с замечательной библиотекой 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, так что теперь вам не нужно определять данный шаблон отдельно.