2017-02-09 4 views
3

Ich benutze Qt 5 auf einem Windows und baue eine GUI App mit mehreren QDialog Klassen. Ich versuche, ein Signal von einem QDialog in einer ausgelösten Aktion der QMainWindow-Klasse zu verbinden, nachdem Instanzen von beiden erstellt wurden. Ich habe die Dokumentation zu Qt hier gelesen: http://doc.qt.io/qt-4.8/signalsandslots.html und hier: https://wiki.qt.io/New_Signal_Slot_Syntax. Ich habe auch viele Fragen zu stackoverflow gelesen, die geholfen haben, einige der anfänglichen Fehler, die ich bekommen habe, zu korrigieren, aber haben mir nicht geholfen, dieses Problem zu lösen.Qt - Verbinden eines Signals/Steckplatzes in einer ausgelösten Aktion

Der Fehler, den ich erhalte ist:

"vor primär Ausdruck erwartet '' Token"

Ich habe versucht, sowohl die alte Syntax für connect

connect(sender, SIGNAL (valueChanged(QString,QString)), 
receiver, SLOT (updateValue(QString))); 

und die neue Syntax (das ist in der CPP-Datei unten)

connect(sender, &Sender::valueChanged, 
receiver, &Receiver::updateValue); 

Das Hauptfenster i erzeugt wird In der Datei main.cpp und dem zweiten Dialog wird on_action_someAction_triggered() erstellt, sodass ich weiß, dass die Instanzen, auf die ich referenziere, existieren. Gibt es einen besseren Weg für mich, das SIGNAL und den SLOT anzuschließen?

Hier ist der Code, mit dem ich arbeite (abzüglich der extra nicht verwandten Code).

Hauptfenster .h:

#include <QMainWindow> 
#include "shipdia.h" 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

public slots: 

    void loadSelectedShip(QString shipName); 

private slots: 

    void on_actionNew_Ship_triggered(); 

private: 
    Ui::MainWindow *ui; 
    shipdia *sDialog; 

}; 

#endif // MAINWINDOW_H 

mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <QTextStream> 
#include <QObject> 


MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
} 

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

void MainWindow::on_actionNew_Ship_triggered() 
{ 
    sDialog = new shipdia(this); 
    QObject::connect(&shipdia,     //this is were I attempt to 
     &shipdia::sendShip,     //connect the signal/slot 
     this,&MainWindow::loadSelectedShip); //but always get an error 
    sDialog ->show(); 

} 

void MainWindow::loadSelectedShip(QString shipName) 
{ 
    ... do something ... //this code works, but the signal is never received 
} 

qdialog.h

#ifndef SHIPDIA_H 
#define SHIPDIA_H 

#include "functions.h" 
#include <QDialog> 

namespace Ui { 
class shipdia; 
} 

class shipdia : public QDialog 
{ 
    Q_OBJECT 

public: 
    explicit shipdia(QWidget *parent = 0); 
    ~shipdia(); 

private slots: 

    void on_pushButton_2_clicked(); 

signals: 
    void sendShip(QString shipName); 

private: 
    Ui::shipdia *ui; 
}; 

#endif // SHIPDIA_H 

qdialog.cpp

#include "shipdia.h" 
#include "ui_shipdia.h" 
#include <QObject> 
#include <QMessageBox> 
#include <QTextStream> 
#include <QDir> 

shipdia::shipdia(QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::shipdia) 
{ 
    ui->setupUi(this); 
} 

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

void shipdia::sendSelectedShip(QString shipName) 
{ 
    emit sendShip(shipName); //I previously just emitted sendSelectedShip, 
          //but separating the function did not fix it. 
} 

void shipdia::on_pushButton_2_clicked() 
{ 
    //Code below functions up to next comment 
    QString shipName = ui->line_23->text(); 
    shipName = QDir::currentPath() + "/shipFolder/" + shipName + ".txt"; 
    QFile shipFile(shipName); 
    QStringList stringList; 

    if (shipFile.open(QIODevice::ReadOnly)) 
    { 
     QTextStream in(&shipFile); 
     while(!in.atEnd()) 
     { 
      QString line = in.readLine(); 
      if(line.isNull()) 
       break; 
      else 
       stringList.append(line); 
     } 
     shipFile.close(); 
    } 

    //Code above functions^

    sendSelectedShip(shipName); //this line does not produce an error 

} 
+1

'shipdia' ist ein Typ (wenn' neue shipdia ... 'zu glauben ist). 'connect (& shipdia, ...)' macht daher keinen Sinn. Du hast wahrscheinlich 'connect (sDialog, ...)' gemeint –

Antwort

1

Ich denke, sollte der Code

sDialog = new shipdia(this); 
QObject::connect(sDialog,    
     &shipdia::sendShip,this,&MainWindow::loadSelectedShip); 

sein und es sollte im Konstruktor des Mainwindow, direkt nach UI-> setupUi (dieser) platziert werden; und die on_actionNew_Ship_triggered() Funktion sollte wie folgt aussehen:

void MainWindow::on_actionNew_Ship_triggered() 
{ 
    sDialog ->show(); 
} 

In Ihrem ursprünglichen Code, eine neue Instanz von shipdia wird jedes Mal die on_actionNew_Ship_triggered erstellt werden() aufgerufen wird. Das sollte vermieden werden.

Hoffe, das hilft.

Verwandte Themen