Signal Slotverbindung arbeitet erst nach dem zweiten öffnen

Verschiedenes zu Qt
Antworten
Vadhagh
Beiträge: 19
Registriert: 15. Februar 2010 12:24

Signal Slotverbindung arbeitet erst nach dem zweiten öffnen

Beitrag von Vadhagh »

Hi,

ich habe ein Projekt mit einem MainWindow und einem Dialog beide als Designklasse im Qt-Creator erstellt. Im Mainfenster ist ein DOM XML Praser untergebracht der eine XML Datei auf bestimmte Werte durchsucht. Diese gebe ich per Signal Slot verbndung an einen Dialog weiter der diese in ausgabefenstern ( QLineEdit und QLabel ) ausgibt.
Vom grundsatz funktioniert das auch, nur werden die Werte im Dialog erst angezeigt beim zweiten betätigen des OK Buttons.
Dachte erst das es an einer Zeitverzögerung zwischen einlesen der Daten und ausgabe liegt aber daran lag es nicht.

Code: Alles auswählen

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->pushButton_ANZEIGEN->hide();
    dialog =new Dialog;
connect(ui->ButADD,SIGNAL (clicked()),this,SLOT(ADD()));
connect(ui->butOK,SIGNAL(clicked()),this,SLOT(OK()));
connect(ui->pushButton_ANZEIGEN,SIGNAL(clicked()),this,SLOT(ANZEIGEN()));


}

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

void MainWindow::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}
void MainWindow::ADD(){
    QString file = QFileDialog::getOpenFileName(this,"Bitte Datei Auswählen",QDir::homePath(),"Dokumente(*.XML)");
    if ( !file.isNull()){

        QString info("Folgenede Datei wurde Ausgewählt:\n");
        info.append(file);
        QMessageBox::information(this,"ihre Auswahl",info,QMessageBox::Ok);
        ui->lineADD->setText(file);

    }
}
void MainWindow::OK(){

    QString filename = ui->lineADD->text();
    QFile file (filename);
    if (file.open(QIODevice::ReadOnly)){
        statusBar()->showMessage(tr("Datei Erfolgreich geladen."),3000);
        QByteArray content = file.readAll();
        QDomDocument doc;
        QString errorMassage;
        if(!doc.setContent(content, &errorMassage)){
            QMessageBox::critical(this,"Fehler","Die von Ihnen ausgewählte Datei konnte nicht gelesen werden!",QMessageBox::Ok);
            }else
        {

    int Ausgabe = 0;
    //hier wird die Zeichnungsnummer aus dem XML File gesucht
        QDomNodeList ZeichNummer = doc.elementsByTagName("Extract_FS_DS");
               for(int i = 0; i < ZeichNummer.length(); i++){
               QDomElement ZeichNummerElement = ZeichNummer.at(i).toElement();
               QString Id = ZeichNummerElement.attribute ("Id");
               emit ZeichNr(Id);
               connect(this,SIGNAL(ZeichNr(QString)),dialog,SLOT(SetZeichNr(QString)));
               Ausgabe = Ausgabe +1;}
    //hier wird das ISSUE aus dem XMl File gesucht
               QDomNodeList Issue = doc.elementsByTagName("Functional_schema_DS");
                  for(int i = 0; i < Issue.length(); i++){
                  QDomElement IssueElement = Issue.at(i).toElement();
                  QString Iss = IssueElement.attribute ("FS_DS_version");
                  emit ISSUE(Iss);
                  connect(this,SIGNAL(ISSUE(QString)),dialog,SLOT(SetISSUE(QString)));
                  Ausgabe = Ausgabe +1;}
    //hier wird der Designer aus dem XML File gesucht
                  QDomNodeList DesName = doc.elementsByTagName("Functional_schema_DS");
                      for(int i = 0; i < DesName.length(); i++){
                      QDomElement DesNameElement = DesName.at(i).toElement();
                      QString DesignName = DesNameElement.attribute ("Designer_name");
                      emit DESname(DesignName);
                      connect(this,SIGNAL(DESname(QString)),dialog,SLOT(SetDESname(QString)));
                      Ausgabe = Ausgabe +1;}
    //hier wird das MOD aus dem XML File gesucht
                      QDomNodeList MOD = doc.elementsByTagName("IGE_Diagram_Defaults");
                             for(int i = 0; i < MOD.length(); i++){
                             QDomElement MODElement = MOD.at(i).toElement();
                             QString mod = MODElement.attribute ("Modification");
                             emit modificaion(mod);
                             connect(this,SIGNAL(modificaion(QString)),dialog,SLOT(Setmodificaion(QString)));
                             Ausgabe = Ausgabe +1;}
    //hier wird das MP aus dem XML File gesucht
                             QDomNodeList MP = doc.elementsByTagName("Requirement");
                                    for(int i = 0; i < MP.length(); i++){
                                    QDomElement MPElement = MP.at(i).toElement();
                                    QString mp = MPElement.attribute ("Id");
                                    emit MPsig(mp);
                                    connect(this,SIGNAL(MPsig(QString)),dialog,SLOT(SetMPsig(QString)));
                                    Ausgabe = Ausgabe +1;}
    //hier wird das ATA aus dem XML File gelesen
                                           QDomNodeList ATA = doc.elementsByTagName("Sub_ATA_DS");
                                                  for(int i = 0; i < ATA.length(); i++){
                                                  QDomElement ATAlement = ATA.at(i).toElement();
                                                  QString AtA = ATAlement.attribute ("Id");
                                                  emit ata(AtA);
                                                  connect(this,SIGNAL(ata(QString)),dialog,SLOT(Setata(QString)));
                                                  Ausgabe = Ausgabe +1;}
                                                  if(Ausgabe ==6)
                                                  ui->pushButton_ANZEIGEN->show();
                                                    } }}
    void MainWindow::ANZEIGEN(){
      dialog->exec();}
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Beitrag von archer »

Kann es sein das du die signale auslößt und dann erst verbindest?

-> erst connect(...) dann emit
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Beitrag von archer »

Noch etwas, ich würde die connects in OK wie z.B

Code: Alles auswählen

connect(this,SIGNAL(ZeichNr(QString)),dialog,SLOT(SetZeichNr(QString))); 
nur einmalig machen. z.B. im Konstruktor, sonst hast du jedesmal eine neue Verbindung.
Warum einen Slot fünf mal aufrufen wenn einmal reicht.
Vadhagh
Beiträge: 19
Registriert: 15. Februar 2010 12:24

Beitrag von Vadhagh »

Danke,

ich hab das schon korrigiert und werde jetzt auch die Signalverknüpfungen ans ende legen.
Hatte das erst in einen Block lassen wollen der übersichthalber, aber du hast recht, macht mehr Sinn die blöcke zu trennen.

MfG
Maik
Antworten