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
}
'shipdia' ist ein Typ (wenn' neue shipdia ... 'zu glauben ist). 'connect (& shipdia, ...)' macht daher keinen Sinn. Du hast wahrscheinlich 'connect (sDialog, ...)' gemeint –