Qt5.10.0 - StyleSheet - virtual expr.

jkallup

Erfahrenes Mitglied
Code:
mypropertysheetextensionplugin.cc: In Elementfunktion »virtual QWidget* MyPropertySheetExtensionPlugin::createWidget(QWidget*)«:
mypropertysheetextensionplugin.cc:31:50: Fehler: invalid new-expression of abstract class type »MyPropertySheetExtensionSub«
     return new MyPropertySheetExtensionSub(parent);
                                                  ^
In file included from mypropertysheetextensionplugin.cc:4:0:
mypropertysheetextensionsub.h:10:7: Anmerkung:   denn die folgenden virtuellen Funktionen sind rein innerhalb »MyPropertySheetExtensionSub«:
 class MyPropertySheetExtensionSub : public
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/jens/Qt5.10/5.10.0/gcc_64/include/QtDesigner/QDesignerPropertySheetExtension:1:0,
                 from mypropertysheetextension.h:4,
                 from mypropertysheetextensionplugin.cc:2:
/home/jens/Qt5.10/5.10.0/gcc_64/include/QtDesigner/propertysheet.h:63:18: Anmerkung:    virtual bool QDesignerPropertySheetExtension::isChanged(int) const
     virtual bool isChanged(int index) const = 0;
                  ^~~~~~~~~

Hallo, kann jemand mit der obigen GCC C++ Ausgabe was anfangen?
falls ja, Bitte um Erklärung. Ich weiss nicht mehr weiter.

Gruß
p32
 

sheel

I love Asm
Hi

"new MyPropertySheetExtensionSub" ist nicht in Ordnung, weil MyPropertySheetExtensionSub eine abstrakte Klasse ist, falls dir der Ausdruck geläufiger ist.

Also es gibt Methoden, die nicht implementiert sind, daher sind keine Objekte der Klasse möglich.
Erbende Kindklassen können die fehlenden Methoden implementieren.

Da deine Klasse selber von der Klasse erbt, die die Problemmethode (isChanged) hat: Eben isChanged selber in deiner Klasse implementieren. Dann gehts.
 

jkallup

Erfahrenes Mitglied
Die header-Datei:

Code:
#include <QDesignerPropertySheetExtension>
#include <QWidget>
#include <QVariant>

class MyPropertySheetExtensionSub : public
      MyPropertySheetExtension
{
public:
    explicit MyPropertySheetExtensionSub(QWidget *parent);

protected:
    virtual QVariant property(int index) const;
   
    virtual int count() const;
    virtual int indexOf(const QString &name) const;
   
    virtual QString propertyName(int index) const;
    virtual QString propertyGroup(int index) const;
   
    virtual bool hasReset(int index) const;
    virtual bool reset(int index);
   
    virtual void setAttribute(int index, bool b);
    virtual void setPropertyGroup(int index, const QString &group);
    virtual void setProperty(int index, const QVariant &value);
    virtual void setVisible(int index, bool b);
    virtual void setChanged(int index, bool changed);
   
    virtual bool isVisible(int index) const;
    virtual bool isAttribute(int index) const;
   
    virtual bool isChanged(int index) const;
};

#endif

Der C++Teil
Code:
#include "mypropertysheetextensionsub.h"

#include <QWidget>
#include <QVariant>

MyPropertySheetExtensionSub::MyPropertySheetExtensionSub(QWidget *parent)
    : MyPropertySheetExtension(parent)
{
    Q_UNUSED(parent)
}

int MyPropertySheetExtensionSub::count() const {
    return 0;
}

int MyPropertySheetExtensionSub::indexOf(const QString &name) const {
    Q_UNUSED(name)
    return 0;
}

QString MyPropertySheetExtensionSub::propertyName(int index) const {
    Q_UNUSED(index)
    return QString("");
}

QString MyPropertySheetExtensionSub::propertyGroup(int index) const {
    Q_UNUSED(index)
    return QString("");
}

void MyPropertySheetExtensionSub::setPropertyGroup(int index, const QString& group) {
    Q_UNUSED(index)
    Q_UNUSED(group)
}

bool MyPropertySheetExtensionSub::hasReset(int index) const {
    Q_UNUSED(index)
    return true;
}

bool MyPropertySheetExtensionSub::reset(int index) {
    Q_UNUSED(index)
    return true;
}

bool MyPropertySheetExtensionSub::isVisible(int index) const {
    Q_UNUSED(index)
    return true;
}

void MyPropertySheetExtensionSub::setVisible(int index, bool b) {
    Q_UNUSED(index)
    Q_UNUSED(b)
}

bool MyPropertySheetExtensionSub::isAttribute(int index) const {
    Q_UNUSED(index)
    return true;
}

void MyPropertySheetExtensionSub::setProperty(int index, const QVariant& value) {
    Q_UNUSED(index)
    Q_UNUSED(value)
}

bool MyPropertySheetExtensionSub::isChanged(int index) const {
    Q_UNUSED(index)
    return true;
}

void MyPropertySheetExtensionSub::setChanged(int index, bool changed) {
    Q_UNUSED(index)
    Q_UNUSED(changed)
}


Und die Ausgabe:
Code:
In file included from /home/jens/Qt5.10/5.10.0/gcc_64/include/QtCore/QtPlugin:1:0,
                 from release/../mypropertysheetextensionplugin.h:7,
                 from release/moc_mypropertysheetextensionplugin.cpp:9:
release/moc_mypropertysheetextensionplugin.cpp: In Funktion »QObject* qt_plugin_instance()«:
release/moc_mypropertysheetextensionplugin.cpp:166:22: Fehler: invalid new-expression of abstract class type »MyPropertySheetExtensionPlugin«
 QT_MOC_EXPORT_PLUGIN(MyPropertySheetExtensionPlugin, MyPropertySheetExtensionPlugin)
                      ^
/home/jens/Qt5.10/5.10.0/gcc_64/include/QtCore/qplugin.h:112:33: Anmerkung: in Definition des Makros »Q_PLUGIN_INSTANCE«
                 _instance = new IMPLEMENTATION; \
                                 ^~~~~~~~~~~~~~
release/moc_mypropertysheetextensionplugin.cpp:166:1: Anmerkung: bei Substitution des Makros »QT_MOC_EXPORT_PLUGIN«
 QT_MOC_EXPORT_PLUGIN(MyPropertySheetExtensionPlugin, MyPropertySheetExtensionPlugin)
 ^~~~~~~~~~~~~~~~~~~~
In file included from release/moc_mypropertysheetextensionplugin.cpp:9:0:
release/../mypropertysheetextensionplugin.h:9:7: Anmerkung:   denn die folgenden virtuellen Funktionen sind rein innerhalb »MyPropertySheetExtensionPlugin«:
 class MyPropertySheetExtensionPlugin
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/jens/Qt5.10/5.10.0/gcc_64/include/QtDesigner/QDesignerPropertySheetExtension:1:0,
                 from release/../mypropertysheetextensionplugin.h:5,
                 from release/moc_mypropertysheetextensionplugin.cpp:9:
/home/jens/Qt5.10/5.10.0/gcc_64/include/QtDesigner/propertysheet.h:43:17: Anmerkung:    virtual int QDesignerPropertySheetExtension::count() const
     virtual int count() const = 0;
                 ^~~~~
/home/jens/Qt5.10/5.10.0/gcc_64/include/QtDesigner/propertysheet.h:45:17: Anmerkung:    virtual int QDesignerPropertySheetExtension::indexOf(const QString&) const
     virtual int indexOf(const QString &name) const = 0;
                 ^~~~~~~
/home/jens/Qt5.10/5.10.0/gcc_64/include/QtDesigner/propertysheet.h:47:21: Anmerkung:    virtual QString QDesignerPropertySheetExtension::propertyName(int) const
     virtual QString propertyName(int index) const = 0;
                     ^~~~~~~~~~~~
/home/jens/Qt5.10/5.10.0/gcc_64/include/QtDesigner/propertysheet.h:48:21: Anmerkung:    virtual QString QDesignerPropertySheetExtension::propertyGroup(int) const
     virtual QString propertyGroup(int index) const = 0;
                     ^~~~~~~~~~~~~
/home/jens/Qt5.10/5.10.0/gcc_64/include/QtDesigner/propertysheet.h:49:18: Anmerkung:    virtual void QDesignerPropertySheetExtension::setPropertyGroup(int, const QString&)
     virtual void setPropertyGroup(int index, const QString &group) = 0;
                  ^~~~~~~~~~~~~~~~
/home/jens/Qt5.10/5.10.0/gcc_64/include/QtDesigner/propertysheet.h:51:18: Anmerkung:    virtual bool QDesignerPropertySheetExtension::hasReset(int) const
     virtual bool hasReset(int index) const = 0;
                  ^~~~~~~~
/home/jens/Qt5.10/5.10.0/gcc_64/include/QtDesigner/propertysheet.h:52:18: Anmerkung:    virtual bool QDesignerPropertySheetExtension::reset(int)
     virtual bool reset(int index) = 0;
                  ^~~~~
/home/jens/Qt5.10/5.10.0/gcc_64/include/QtDesigner/propertysheet.h:54:18: Anmerkung:    virtual bool QDesignerPropertySheetExtension::isVisible(int) const
     virtual bool isVisible(int index) const = 0;
                  ^~~~~~~~~
/home/jens/Qt5.10/5.10.0/gcc_64/include/QtDesigner/propertysheet.h:55:18: Anmerkung:    virtual void QDesignerPropertySheetExtension::setVisible(int, bool)
     virtual void setVisible(int index, bool b) = 0;
                  ^~~~~~~~~~
/home/jens/Qt5.10/5.10.0/gcc_64/include/QtDesigner/propertysheet.h:57:18: Anmerkung:    virtual bool QDesignerPropertySheetExtension::isAttribute(int) const
     virtual bool isAttribute(int index) const = 0;
                  ^~~~~~~~~~~
/home/jens/Qt5.10/5.10.0/gcc_64/include/QtDesigner/propertysheet.h:58:18: Anmerkung:    virtual void QDesignerPropertySheetExtension::setAttribute(int, bool)
     virtual void setAttribute(int index, bool b) = 0;
                  ^~~~~~~~~~~~
/home/jens/Qt5.10/5.10.0/gcc_64/include/QtDesigner/propertysheet.h:60:22: Anmerkung:    virtual QVariant QDesignerPropertySheetExtension::property(int) const
     virtual QVariant property(int index) const = 0;
                      ^~~~~~~~
/home/jens/Qt5.10/5.10.0/gcc_64/include/QtDesigner/propertysheet.h:61:18: Anmerkung:    virtual void QDesignerPropertySheetExtension::setProperty(int, const QVariant&)
     virtual void setProperty(int index, const QVariant &value) = 0;
                  ^~~~~~~~~~~
/home/jens/Qt5.10/5.10.0/gcc_64/include/QtDesigner/propertysheet.h:63:18: Anmerkung:    virtual bool QDesignerPropertySheetExtension::isChanged(int) const
     virtual bool isChanged(int index) const = 0;
                  ^~~~~~~~~
/home/jens/Qt5.10/5.10.0/gcc_64/include/QtDesigner/propertysheet.h:64:18: Anmerkung:    virtual void QDesignerPropertySheetExtension::setChanged(int, bool)
     virtual void setChanged(int index, bool changed) = 0;
                  ^~~~~~~~~~
make[1]: *** [release/moc_mypropertysheetextensionplugin.o] Fehler 1
make[1]: Verzeichnis »/home/jens/qtcreator/4.5.0/src/plugins/popupmenu/MyPropertySheetExtensionPlugin« wird verlassen
make: *** [release] Fehler 2
 

sheel

I love Asm
Ok, die Fehlermeldung listet alle pur-virtuellen Methoden vom Parent, nicht nur die fehlenden bei dir..

isChanged ist zwar vorhanden, aber property nicht.
 

sheel

I love Asm
Sorry, aber ich fang jetzt nicht an mir eine Qt-Buildumgebung einzurichten, damit ich dein Problem sehe...
 

jkallup

Erfahrenes Mitglied
brauchst Du auch nicht.
der Fehler:

Code:
In file included from /home/jens/Qt5.10/5.10.0/gcc_64/include/QtCore/QtPlugin:1:0,
                 from release/../mypropertysheetextensionplugin.h:7,
                 from release/moc_mypropertysheetextensionplugin.cpp:9:
release/moc_mypropertysheetextensionplugin.cpp: In Funktion »QObject* qt_plugin_instance()«:
release/moc_mypropertysheetextensionplugin.cpp:166:22: Fehler: invalid new-expression of abstract class type »MyPropertySheetExtensionPlugin«
 QT_MOC_EXPORT_PLUGIN(MyPropertySheetExtensionPlugin, MyPropertySheetExtensionPlugin)
                      ^
/home/jens/Qt5.10/5.10.0/gcc_64/include/QtCore/qplugin.h:112:33: Anmerkung: in Definition des Makros »Q_PLUGIN_INSTANCE«
                 _instance = new IMPLEMENTATION; \
                                 ^~~~~~~~~~~~~~
release/moc_mypropertysheetextensionplugin.cpp:166:1: Anmerkung: bei Substitution des Makros »QT_MOC_EXPORT_PLUGIN«
 QT_MOC_EXPORT_PLUGIN(MyPropertySheetExtensionPlugin, MyPropertySheetExtensionPlugin)
 ^~~~~~~~~~~~~~~~~~~~
 

Technipion

Erfahrenes Mitglied
Hallo jkallup,
du versuchst da glaube ich etwas sehr spezielles zu machen :D
ABER: Nichts ist unmöglich!

Ich habe mich mal auf deinem GitHub Repo umgeschaut, da scheinst du ja rege weiter an dem Problem zu arbeiten. Allerdings sind mittlerweile die Quelldateien, die deinen ursprünglichen Fehler verursacht haben, verschwunden. Ich glaube die Erweiterung des QtDesigners erfordert einiges an Einarbeitungszeit, und das machen die anderen Mitglieder des Forums natürlich nicht einfach mal so zwischendurch zum Spaß. Aber ich habe ein offizielles Beispiel im QtDesigner Manual gefunden, wie Elemente erweitert werden können. Guckst du hier: http://doc.qt.io/qt-5/qtdesigner-containerextension-example.html .
So etwa ab der Hälfte des Tutorials geht's an die QDesignerPropertySheetExtension. Vielleicht hilft dir das ja weiter...

Gruß Technipion
 

jkallup

Erfahrenes Mitglied
Hallo Technipion,

mitleerweile bin ich nun soweit Plugins zu Erstellen.
Aber ich möchte nun Support für eine Andere Programmiersprache einbauen.
Dazu habe ich mir die plugins sourcen von pythoneditor angeschaut,
eine Kopie gemacht und lediglich das Python mit dBase ersetzt.

https://github.com/paule32/QtPluginEditor

leider weiss ich nun nicht mehr weiter, wie man den Compiler aufruft,
oder eine Projektdatei anlegt, so wie es bei C++ Projekten auch geht.
Die TreeListe meine ich damit, die im QtCreator links erscheint, sobald
man eine .pro Datei öffnet.