2017-02-09 4 views
3

Windows에서 Qt 5를 사용하고 있고 QDialog 클래스가 여러 개인 GUI 응용 프로그램을 작성 중입니다. QMainWindow 클래스의 인스턴스가 생성 된 후 QMainWindow 클래스의 트리거 된 동작에서 QDialog의 신호를 연결하려고합니다. 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가 만들어집니다. n main.cpp와 두 번째 대화 상자가 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'는 ('new shipdia ...가 믿어지면) 유형입니다. 'connect (& shipdia, ...) '는 의미가 없습니다. 아마 당신은'connect (sDialog, ...)' –

답변

1

제가

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

있어야 생각하고 바로 UI-> setupUi (이) 후 MainWindow를 생성자에 배치해야; 그리고 on_actionNew_Ship_triggered() 함수는 다음과 같아야합니다

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

를 원래의 코드에서 shipdia의 새로운 인스턴스는 매번 호출되는 on_actionNew_Ship_triggered()를 생성됩니다. 그것은 피해야합니다.

희망이 도움이됩니다.