Почему QT говорит мне, что мой унаследованный класс QDialog не является QWidget? - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь создать / добавить диалоговое окно в свое приложение. Чтобы объяснить, почему имя диалогового окна - это сохранение конфигурации / настроек, таких как темы / стили и т. Д., Так называемый SettingsDialog. По какой-то причине я не получаю ошибок в заголовочном файле, но я получаю ошибки в файле cpp - сначала я кричал, что конструктор выглядел как конструктор, но не был таковым или чем-то в этом роде - мне показалось, чтобы исправить это, просто применив тела к любому другому методу (хотя раньше я никогда не получал эту ошибку). Теперь, когда я пытаюсь создать QSplitter, он говорит мне, что «this» не является QWidget, когда он ссылается на этот класс, QDialog, который согласно документации QT унаследован от QWidget. Я чувствую, что где-то есть опечатка, которую мне не хватает Пожалуйста, я надеюсь, что кто-то может увидеть блокировку и помочь мне устранить ее.

Прежде чем кто-то пожалуется, что это не так просто, как хотелось бы - я включаю только минимальные методы и элементы - Каждый виджет, который я создаю имеет метод initPanel / Window / Dialog и метод initControls, который вызывается из другого метода init после других конфигураций. Как видите, в конструкторе я вызываю initDialog. Я помещаю свои классы в пространство имен - конечно, это может быть много пустого пространства, но если, удалив раздел пространства имен, это исправит это - это не исправит это для меня - Пространства имен необходимы, поэтому мне нужно решение, которое хранит их в код, поэтому я не удалил их. В противном случае, я не могу ничего раздеть. В конечном итоге, когда я получу эту часть, чтобы прекратить создавать ошибки, сборка будет завершена, и больше, так что отключение методов init, даже если они сейчас не вызываются, ничего не поможет.

SettingsDialog. ч:

#pragma once

#include <QDialog>
#include <QSplitter>

namespace net
{
    namespace draconia
    {
        namespace mediadb
        {
            namespace ui
            {
                class SettingsDialog : public QDialog
                {
                    Q_OBJECT

                    QSplitter *mPnlSplitter;
                protected:
                    QSplitter *getSplitter() const;
                    void initControls();
                    void initDialog();
                public:
                    SettingsDialog(QWidget *parent = nullptr);
                };
            }
        }
    }
}

НастройкиDialog. cpp:

#include "SettingsDialog.h"

using namespace net::draconia::mediadb::ui;

QSplitter *SettingsDialog::getSplitter() const
{
    if(mPnlSplitter == nullptr)
        {
        mPnlSplitter = new QSplitter(Qt::Orientation::Horizontal, this);  // Error - no matching constructors evidently
        }
}

void SettingsDialog::initControls()
{ }

void SettingsDialog::initDialog()
{ }

SettingsDialog::SettingsDialog(QWidget *parent)
    :   QDialog(parent)
    ,   mPnlSplitter(nullptr)
{
    initDialog();
}

1 Ответ

2 голосов
/ 20 марта 2020
  1. Вы пытаетесь изменить элемент mPnlSplitter в методе const getSplitter().
  2. * Конструктор 1007 * принимает QWidget *, а не const QWidget *

Также обратите внимание, что QSplitter *SettingsDialog::getSplitter() const должно возвращать значение, но в методе нет возврата.

...