В настоящее время я работаю над графическим интерфейсом пользователя для программы, использующей 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;
};
Я, конечно, открыт для всех комментариев и способов улучшения кода и редактирования вопросов.