2017-02-09 24 views
3

Я использую Qt 5 на Windows и создаю приложение GUI с несколькими классами QDialog. Я пытаюсь подключить сигнал от QDialog в запущенном действии класса QMainWindow после того, как были созданы экземпляры обоих. Я прочитал документацию по Qt здесь: http://doc.qt.io/qt-4.8/signalsandslots.html и здесь: https://wiki.qt.io/New_Signal_Slot_Syntax. Я также прочитал много вопросов о stackoverflow, которые помогли исправить некоторые из начальных ошибок, которые я получал, но не помогли мне решить эту проблему.Qt - соединение сигнала/слота в инициированном действии

Ошибка я получаю это:

«ожидается первичное-выражение перед„“знак»

Я попытался как старый синтаксис для подключения

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

и новый синтаксис (который показан в файле .cpp ниже)

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

MainWindow создан i n main.cpp и 2-й диалог создается on_action_someAction_triggered(), поэтому я знаю, что экземпляры, на которые я ссылаюсь, существуют. Есть ли лучший способ подключения SIGNAL и SLOT?

Вот код, с которым я работаю (за вычетом дополнительного несвязанного кода).

MainWindow .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' - это тип (если полагать, что« новый корабль ... »). 'connect (& shipdia, ...)' поэтому не имеет смысла. Вероятно, вы имели в виду 'connect (sDialog, ...)' –

ответ

1

Я думаю, код должен быть

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

и он должен быть помещен в конструкторе MainWindow, сразу после ui-> setupUi (это); и функция on_actionNew_Ship_triggered() должен выглядеть следующим образом:

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

В исходном коде, новый экземпляр shipdia будет создан каждый раз в on_actionNew_Ship_triggered() называется. Этого следует избегать.

Надеюсь, это поможет.