QT Plugin -> Widget von MainWindow ändern ....



  • Hallo mal wieder,

    ich versuche gerade mein Programm etwas umzustrukturieren .... Dazu hab ich mich mal mit dem Thema Plugins beschäftigt. Ich habe also ein Plugin erstellt und geladen, eine einfache Testfunktion die eine MessageBox aufruft funktioniert.
    Nun möchte ich eine umfangreichere Berechnung in das Plugin auslagern, welche diverse Felder eines QTableView füllt. In der Originalen Funktion tu ich dies mit folgedem Code:

    ui->auswertungview->setItem(7, 2, new QTableWidgetItem(QString("%1").arg(umsatzsoll, 0,'f',2)+QString(" %1").arg(QChar(8364))));
    

    Wie kann ich das nun aus dem Plugin heraus realisieren ? Ich hatte versucht ein Objekt auf MainWindow zu erstellen, das brachte aber keinen Erfolg.

    Kann mir bitte wer auf die Sprünge helfen ?

    Der Nala



  • Soll das Plugin das QTableWidget selber erstellen, oder in ein bestehendes die Werte eintragen?
    Nur so nebenbei, Source in UTF-8 speichern und

    QString::fromUtf8("%1 €").arg(umsatzsoll, 0,'f',2))
    


  • Im Moment erstmal in ein bestehendes Eintragen .... Das QTableView selbst erzeugen, an sowas wollte ich mich erst ranwagen wenn ich mit den Plugin-Mechanismen vertrauter bin .....

    Und danke, werd das mal so umsetzen ....



  • Schonmal das Example Echoplugin durchgearbeitet http://doc.qt.nokia.com/4.7/tools-echoplugin.html?
    Hab dort mal das Befüllen eines QTableWidget reingemacht. Vielleicht hilft dir da ja als Idee.
    http://ff06d07.filefactory.com/dl/f/ccb2d68//b/3/h/1d97291712ea771c7a7a580b/m/2cd1aa7ac93e9a7522007fe4061c3cb3/n/echoplugin.zip



  • Danke erstmal, dein Beispiel funktioniert bei mir, mein eigenes Plugin läßt mein Programm abstürzen ich vermute ich hab beim umschreiben einen Fehler gemacht, finden den Aber im Moment nicht ... vielleicht könnt ihr ja mal kurz mit drüber schauen ..... Mein Plugin heißt warenwirtschaft ....

    warenwirtschaft.cpp (gekürzt)

    #include <QtGui>
    #include <QtSql>
    #include <QTableWidget>
    #include "warenwirtschaft.h"
    
    void WwPlugin::auswertung(QTableWidget* w, QString selectbar) {
        .
        .
        w->setColumnCount(4);
        w->setRowCount(9);
        .
        .
        .
        w->setItem(7, 2, new QTableWidgetItem(QString("%1").arg(umsatzsoll, 0,'f',2)+QString(" %1").arg(QChar(8364))));
        .
        .   
    }
    
    Q_EXPORT_PLUGIN2(wwplugin, WwPlugin)
    

    warenwirtschaft.h

    #ifndef WARENWIRTSCHAFT_H
    #define WARENWIRTSCHAFT_H
    
    #include <QObject>
    #include "warenwirtschaftinterface.h"
    #include "warenwirtschaft.h"
    
    class WwPlugin : public QObject, WwInterface
    {
        Q_OBJECT
        Q_INTERFACES(WwInterface);
    
    public:    
        void auswertung(QTableWidget* w, QString selectbar);
    
    private:
    };
    
    #endif // WARENWIRTSCHAFT_H
    

    warenwirtchaftinterface.h

    #ifndef WARENWIRTSCHAFTINTERFACE_H
    #define WARENWIRTSCHAFTINTERFACE_H
    
    #include <QTableWidget>
    
    class WwInterface
    {
    
    public:
        virtual ~WwInterface(){}
    
        virtual void auswertung(QTableWidget* w, QString selectbar);
    
    };
    
    Q_DECLARE_INTERFACE(WwInterface,"com.GaMan.plugins.wwininterface/1.0")
    
    #endif // WARENWIRTSCHAFTINTERFACE_H
    

    Und Aufgerufen wird die Funktion mit

    wwInterface->auswertung(ui->auswertungview, ui->auswertungbarselect->currentText());
    

    Im moment bekomme ich den Fehler "undefinde reference to 'vtable for WwInterface'"

    Danke schonmal, der Nala

    P.S.: Ja ich hab hier noch nicht den UTF8 String drin 😃

    EDIT: den Vtable fehler habe ich mit

    virtual void auswertung(QTableWidget* w, QString selectbar) = 0;
    

    beheben können .... nun bin ich wieder an dem Punkt das das Programm beim Aufruf des Plugins Abstürzt ....



  • Schon mal im Debugger gestartet? Im Stacktrace solltest du die Stelle eingrenzen können. Setzte davor dann ein Breakpoint und versuch nachzuvollziehen ob alles richtig initialisiert, ... ist.



  • Ich konnte es insofern eingrenzen, das der Aufruf an sich das Problem ist .....

    ich hab nun mal die Funktion im Plugin mit folgender ersetzt:

    void WwPlugin::auswertung() {
        QMessageBox msg;
        msg.setText("Auswertung clicked!");
        msg.exec();
    }
    

    Und beim Aufruf von:

    wwInterface->auswertung();
    

    Stürzt das Programm ab. Das Plugin wird an der richtigen stelle gesucht und gefunden. Wenn ich folgenden Code ändere:

    void MainWindow::loadPlugin()
    {
             QDir pluginsDir(qApp->applicationDirPath());
         #if defined(Q_OS_WIN)
             if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release")
                 pluginsDir.cdUp();
         #elif defined(Q_OS_MAC)
             if (pluginsDir.dirName() == "MacOS") {
                 pluginsDir.cdUp();
                 pluginsDir.cdUp();
                 pluginsDir.cdUp();
             }
         #endif
             pluginsDir.cd("plugins");
             foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
                 QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
                 QObject *plugin = pluginLoader.instance();
                 if (plugin) {
                         addFeatures(plugin);;
                 }
             }
    }
    
    void MainWindow::addFeatures(QObject *plugin)
    {
        WwInterface *iWw = qobject_cast<WwInterface *>(plugin);
             if (!iWw)
                 ui->tabWidget->removeTab(2);
    }
    

    sprich ich in der AddFeatures-If schleife das ! wegnehme, wird der Tab auch korrekt entfernt.

    Wenn ich im Debugger einen Breakpoint genau auf den Aufruf setze, erscheint auch ein Objekt namens WwInterface vom Typ WwInterface *, dieser scheint aber leer zu sein.
    Wenn ich nun fortsetze stürzt das Programm ab und der Debugger zeigt mir diese Stelle

    0x00415bb2  <+20>:            	mov    (%eax),%edx
    

    Aber so richtig weiß ich gerade nichts damit anzufangen ....



  • Lösung vorerst gefunden .....

    Das hab ich beim Umschreiben vergessen:

    wwInterface = qobject_cast<WwInterface *>(plugin);
    

Anmelden zum Antworten