QtE5EntryPoint

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

Добавить комментарий