Абстракция Qt, не удается подключиться - PullRequest
0 голосов
/ 28 сентября 2019

В настоящее время я работаю над графическим интерфейсом пользователя для программы, использующей Qt, этот интерфейс должен быть абстрактным.

Для этого я в основном использую два класса QtUiFunctions, который использует Qt и содержит базовые функции, такие как addButton или addShape и GUI, которые не используют Qt напрямую, но вызывают функции из QtUiFunctions для этого и содержит более сложные функции, такие как displayAuthWindow или displayMainWindow.
Чтобы иметь возможность использовать функции для создания кнопки, все они должны быть в одном классе, проще всего было небыть в классе или быть статичным.
GUI содержит указатель на QtUiFunctions, чтобы иметь возможность использовать указанные функции.

Моя проблема в том, что у меня есть несколько кнопок, которые вызывают displayAuthWindow или displayMainWindow для переключения между меню, эти кнопки вызывают функции, которые сами делают другие кнопки.
Так что эти функции должны быть статичными в порядкебыть превращенным в кнопку, но если они есть, они не могут получить доступ к указателю на QtUiFunctions и сделать кнопки сами.

Я пытался использовать шаблоны, чтобы сделать мои функции статичными, но это невозможно, потому что функция, которая мне нужна для шаблона, является виртуальной.

main.cpp

#include <QApplication>
#include <QFont>
#include <QLineEdit>
#include <QtWidgets/QApplication>

#include "GUI.hpp"
#include "QtUiFunctions.hpp"

int main(int argc, char **argv)
{
    GUI gui(new QtUiFunctions());

    gui.displayAuthScreen();   
    return gui.getFunctions()->start();
}

GUI.cpp

#include "GUI.hpp"

GUI::GUI(IUiFunctions *functions) :
_functions(functions)
{
}

GUI::~GUI(void)
{
}

void GUI::displayAuthScreen(void)
{
    WidgetCoordinates positioner(317, 225, 255, 100);

    _functions->addShape(positioner);
    positioner.set(430, 285, 100, 30);
    _functions->addButton(positioner, "Connect", displayMainScreen);
    positioner.set(322, 235, 80, 30);
    _functions->addText(positioner, " Username :");
    positioner.set(400, 235, 160, 30);
    _functions->addTextInput(positioner);
}

void GUI::displayMainScreen(void)
{
    WidgetCoordinates positioner(170, 10, 780, 520);

    _functions->addShape(positioner);
    positioner.set(10, 10, 150, 50);
    _functions->addButton(positioner, "1", displayAuthScreen);
    positioner.set(10, 70, 150, 50);
    _functions->addButton(positioner, "2", displayAuthScreen);
    positioner.set(10, 130, 150, 50);
    _functions->addButton(positioner, "3", displayAuthScreen);
}

std::unique_ptr<IUiFunctions>& GUI::getFunctions()
{
    return _functions;
}

GUI.hpp

#pragma once

#include <iostream>
#include <memory>

#include "IUiFunctions.hpp"

class GUI {
    public:
        GUI(IUiFunctions *functions);
        ~GUI();
        void clearScreen(void);
        static void displayAuthScreen(void);
        static void displayMainScreen(void);
        std::unique_ptr<IUiFunctions>& getFunctions();
    private:
        std::unique_ptr<IUiFunctions> _functions;
};

IUiFunctions.hpp

#pragma once

#include <string>

#include "WidgetCoordinates.hpp"

class IUiFunctions {
    public:
        virtual void addButton(WidgetCoordinates coord, std::string text, void (*f)(void)) = 0;
        virtual void addShape(WidgetCoordinates coord) = 0;
        virtual void addText(WidgetCoordinates coord, std::string text) = 0;
        virtual void addTextInput(WidgetCoordinates coord) = 0;
        virtual int start() = 0;
        virtual ~IUiFunctions() = default;
};

GtUiFunctions.cpp

#include <string.h>
#include <stdlib.h>

#include "QtUiFunctions.hpp"
#include "Tools.hpp"

int ac = 1;

QtUiFunctions::QtUiFunctions() :
_app(new QApplication(ac, nullptr)),_window(new QMainWindow())
{
    std::string path = "src/client/background.jpg";

    _window.setFixedSize(960, 540);
    _window.show();
}

QtUiFunctions::~QtUiFunctions()
{
}

void QtUiFunctions::addButton(WidgetCoordinates coord, std::string text, void (*f)(void))
{
    QPushButton *button = new QPushButton(QString::fromStdString(text), &_window);
    button->setGeometry(coord.pos_x, coord.pos_y, coord.size_x, coord.size_y);
    QObject::connect(button, &QPushButton::clicked, button, f);
    button->show();
}

void QtUiFunctions::addShape(WidgetCoordinates coord)
{
    QLabel *label = new QLabel("", &_window);
    label->setGeometry(coord.pos_x, coord.pos_y, coord.size_x, coord.size_y);
    label->setStyleSheet("QLabel {background-color : white;}");
    label->show();
}

void QtUiFunctions::addText(WidgetCoordinates coord, std::string text)
{
    QLabel *label = new QLabel(QString::fromStdString(text), &_window);
    label->setGeometry(coord.pos_x, coord.pos_y, coord.size_x, coord.size_y);
    label->show();
}

void QtUiFunctions::addTextInput(WidgetCoordinates coord)
{
    QLineEdit *input = new QLineEdit(&_window);
    input->setGeometry(coord.pos_x, coord.pos_y, coord.size_x, coord.size_y);
    input->show();
}

int QtUiFunctions::start()
{
    return _app->exec();
}

QtUiFunctions.hpp

#pragma once

#include <GUI.hpp>
#include <QApplication>
#include <QGraphicsPixmapItem>
#include <QGraphicsScene>
#include <QImage>
#include <QLabel>
#include <QLineEdit>
#include <QMainWindow>
#include <QObject>
#include <QPainter>
#include <QPushButton>
#include <QRect>
#include <QString>
#include <QObject>

#include "IUiFunctions.hpp"

class QtUiFunctions : public IUiFunctions {
    public:
        QtUiFunctions();
        void addButton(WidgetCoordinates coord, std::string text, void (*f)(void));
        void addShape(WidgetCoordinates coord);
        void addText(WidgetCoordinates coord, std::string text);
        void addTextInput(WidgetCoordinates coord);
        int start();
        ~QtUiFunctions();

    private:
        QApplication *_app;
        QMainWindow _window;
};

Я, конечно, открыт для всех комментариев и способов улучшения кода и редактирования вопросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...