Seite 1 von 1

Klasse QDialog aufrufen, Variable wird leer übergeben

Verfasst: 2. Juni 2010 23:36
von Lukas
Hallo
Hoffe Ihr könnt mir nochmals weiterhelfen.

Ich habe eine Klasse MainWindow und öffne einen QDialog mit 2 Comboboxen.
Dabei möchte ich einen QString übergeben, leider kommt dieser immer leer an.
Wenn ich debugge und auf die Variable rs232config zeige, steht "not in scope".

Irgend etwas habe ich da wohl falsch verstanden.
Danke für Eure Mühe


Aufruf von QDialog:

Code: Alles auswählen

void MainWindow::on_pushButton_2_clicked()
{

    tmp_RS232Config = data_rs232config; 
    RS232Configfrm * f1;
    QString a;
    a="test";
    f1 = new RS232Configfrm(a,this); [b]//Aufruf mit a="test" [/b]
    connect(f1, SIGNAL(s_tmp_rs232config_port(QString)),this, SLOT(tmp_rs232config_port(QString)));
    connect(f1, SIGNAL(s_tmp_rs232config_baudrate(QString)),this, SLOT(tmp_rs232config_baudrate(QString)));
    int x
    x=f1->exec();
    if (x==1)
    {
        data_rs232config = tmp_RS232Config;
    }
    else
    {
        tmp_RS232Config = data_rs232config;
    }
}
RS232Configfrm.h:

Code: Alles auswählen

#ifndef RS232CONFIGFRM_H
#define RS232CONFIGFRM_H
#include <QDialog>
#include "globalstructs.h"
namespace Ui {
    class RS232Configfrm;
}

class RS232Configfrm : public QDialog {
    Q_OBJECT
public:
    RS232Configfrm(QString rs232config, QWidget *parent = 0);[b] // a="text" sollte hier in QString rs232config kopiert werden[/b]
    ~RS232Configfrm();

protected:
    void changeEvent(QEvent *e);

private:
    Ui::RS232Configfrm *ui;


signals:
       void s_tmp_rs232config_port(QString);
       void s_tmp_rs232config_baudrate(QString);
private slots:
    void on_comboBox_2_activated(QString );
    void on_comboBox_activated(QString );
};
RS232Configfrm.cpp

Code: Alles auswählen

#endif // RS232CONFIGFRM_H


 #include "rs232configfrm.h"
#include "ui_rs232configfrm.h"

RS232Configfrm::RS232Configfrm(QString rs232config, QWidget // a="text" sollte hier in QString rs232config kopiert werden[/b]*parent) :
    QDialog(parent),
    ui(new Ui::RS232Configfrm)
{
    ui->setupUi(this);
    ui->comboBox->addItem("COM0", QVariant::fromValue(QString("COM0")));
    ui->comboBox->addItem("COM1", QVariant::fromValue(QString("COM1")));
    //ui->comboBox->setCurrentIndex(4);
   ui->comboBox->addItem(rs232config,rs232config); [b]//rs232config= leer / "not in scope"[/b]
    ui->comboBox_2->addItem("115200", QVariant::fromValue(QString("BAUD115200")));
    ui->comboBox_2->addItem("128000", QVariant::fromValue(QString("BAUD128000")));
    //ui->comboBox_2->setCurrentIndex(11);
   ui->comboBox_2->addItem(rs232config,rs232config);
}

RS232Configfrm::~RS232Configfrm()
{
    delete ui;
}

void RS232Configfrm::changeEvent(QEvent *e)
{
    QDialog::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void RS232Configfrm::on_comboBox_activated(QString text)
{
    emit s_tmp_rs232config_port(text);
}

void RS232Configfrm::on_comboBox_2_activated(QString text)
{
    emit s_tmp_rs232config_baudrate(text);
}

Großes Dankeschön für alle Tipps und Ratschläge

Bin auch gerne für andere Verbesserungsvorschläge zu haben ;)

Danke, schöne Abend

lg Lukas

Verfasst: 4. Juni 2010 08:57
von franzf
Wo jetzt das Problem liegt weiß ich nicht. Kannst du den Code mal reduzieren und ein minimales, kompilierbares Beispiel draus stricken? Es schaut eigentlich alles korrekt aus und sollte funktionieren.

Zu den Verbesserungen:

Code: Alles auswählen

    RS232Configfrm * f1; // 1)
    QString a; // 2)
    a="test";
    f1 = new RS232Configfrm(a,this);
1) Du legst deinen Dialog mit new an, löschst den alten aber nie -> Memory Leak. Durch das Parent wird zwar schon das Objekt zerstört, aber erst dann, wenn das MainWindow über den Jordan geschickt wird, und das ist erst ganz am Ende der Fall. Bis dahin wird bei jedem Aufruf der SPeicherverbrauch größer.
Leg doch das Objekt in den automatischen Speicherbereich, dann wird das Objekt auch zerstört, wenn die Funktion beendet wird:

Code: Alles auswählen

RS232Configfrm f1(a, this);
2) Das seh ich bei dir öfter, gilt z.B. auch für obigen Punkt 1). Du legst ein Objekt default-initialisiert an, um ihm direkt danach noch einen anderen Wert zuzuweisen. Ist zwar keine soooo gewaltige Performancebremse, aber eben auch völlig unnötig, denn dafür gibt es weitere Konstruktoren neben dem Default-Konstruktor.
Mögliche Varianten:

Code: Alles auswählen

QString s1("Test");
QString s2 = "test";
3) Dir ist klar, dass deine SLOTS so niemals aufgerufen werden? Du hältst dich zwar an die Konventionen beim SLOT-Namen für die connectSlotsByName - tust aber nix dafür, dass es auch funktioniert.
*) von deinem Ui::RS232Configfrm ableiten (zusätzlich zum QDialog), dann geht das auch automatisch.
*) Ansonsten nach dem setupUi() QMetaObject::connectSlotsByName aufrufen.