Правильный способ передать объект QColor в подкласс Qdialog - PullRequest
0 голосов
/ 14 июля 2020

У меня проблема с подклассом QDialog, который я использую для передачи двух объектов QT в: QColor и QFont. Если я перейду по ссылке, приложение неожиданно выйдет из строя, прежде чем оно сможет запуститься, даже если оно скомпилировано без ошибок.

Мне удалось заставить его работать с помощью указателей, но оно выглядит некрасиво и испортит остальную часть кода . Я хочу заставить его работать по ссылке и воздерживаться от использования ключевого слова New для создания экземпляров классов QFont или QColor. Итак, в основном мой рабочий конструктор подкласса с использованием указателей выглядит так:

HEADER:

class MySettingsDialog : public QDialog
{
Q_OBJECT

public:
explicit MySettingsDialog(QColor *acolor, QFont *afont, QWidget *parent=0);

CLASS FILE:
MySettingsDialog::MySettingsDialog(QColor *acolor, QFont *afont, QWidget *parent) :
QDialog(parent, Qt::WindowCloseButtonHint), m_color(*acolor),     m_font(*afont),
ui(new Ui::MySettingsDialog)
{

ui->setupUi(this);
}

Этот способ работает, но мне нужно в моем MainWindow. cpp файле объявить, например:

QFont * systemFont;

 systemFont = New QFont("myfont whatever");

И везде, где я хочу применить этот шрифт, я должен демаскировать следующим образом: ui-> mylabel-> setfont (* systemFont).

Раньше я не использовал new для создания экземпляра моей переменной systemFont, а systemFont не был объявлен как указатель в файле заголовка. Таким образом, если Mydialog был объявлен таким образом, программа вылетает:

НЕ РАБОТАЕТ:

HEADER

 explicit MySettingsDialog(const QColor &acolor, const QFont &afont, QWidget *parent=0);

CLASS FILE:
 MySettingsDialog::MySettingsDialog(const QColor &acolor, const QFont &afont, QWidget      *parent) :
 QDialog(parent, Qt::WindowCloseButtonHint), m_color(acolor), m_font(afont),
 ui(new Ui::MySettingsDialog)
{

ui->setupUi(this);
 }

Mainwindow:

MySettingsDialog (systemColor, systemFont, this);

Что я делаю не так?

Спасибо

1 Ответ

0 голосов
/ 14 июля 2020

Вещи становились все более и более странными, но я наконец понял это. Кажется, что вы не можете создать подкласс QDialog внутри подпрограммы функции. У меня была процедура init(), и запуск этого кода не работал:

void MyProgram :: init () {systemColor = QColor ("red"); systemFont = QFont ("Consolas", zoomFactor);

settingsDialog = new UefiSettingsDialog(systemColor, systemFont, this);
......  ...  ...  }

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

...