2016-07-06 11 views
-1

2つのクラス間でデータをやり取りしようとしています。 最初のクラスにはQStringを送信するSignalがあり、2番目のクラスにはQStringを受け取るSlotがあります。問題は、QStringを受け取ったクラスがそれを保持していないことです。スロットには表示されますが、クラス内の他の場所には表示されません。ここに私のコードは次のとおりです。信号/スロット転送後にデータを保持できない

class1.h(送信者)

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

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

signals: 
    void message(QString resolution); 

private: 

    GLWidget *widget; 

    QString resolution; 

}; 

#endif // MAINWINDOW_H 

class2.h(レシーバー)

class GLWidget : public QGLWidget 
{ 
    Q_OBJECT 
public: 
    explicit GLWidget(QWidget *parent = 0); 

// 
... 
// 
    float zoomWindow; 

    QString resolution; 


public slots: 

    void reception(QString resolution); 

}; 

class1.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

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

    resolution = ""; 

    widget = new GLWidget(NULL); 
    connect(this, SIGNAL(message(QString)), widget, SLOT(reception(QString))); 
} 

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

void MainWindow::on_radioButton_clicked() 
{ 
    resolution="0.2"; 
    emit message(resolution); 
} 

void MainWindow::on_radioButton_3_clicked() 
{ 
    resolution="0.3"; 
    emit message(resolution); 
} 

void MainWindow::on_radioButton_2_clicked() 
{ 
    resolution="0.5"; 
    emit message(resolution); 
} 

class2.cpp

GLWidget::GLWidget(QWidget *parent) : 
     QGLWidget(parent) 
{ 
    zoomWindow=0.5; 
} 

void GLWidget::reception(QString resolution){ 

    qDebug()<<resolution;    //DISPLAY CORRECTLY 

    zoomWindow = resolution.toFloat(); //TRYING TO STOCK THE VALUE OF RESOLUTION            .          IN ZOOMWINDOW 

    qDebug()<<zoomWindow;    //DISPLAY CORRECTLY 

} 

私は私が唯一興味深い部分を聞かせて、明らかにすべてのコードを書いていません。

したがって、「受信」機能ではzoomWindowの値は正しいですが、別の機能で表示しようとすると元の値に戻ります。

値を転送するために受信スロットに機能を実装しようとしましたが、機能しません。

ありがとうございました

+1

あなたは 'GLWidget :: reception(QString resolution)'で 'resolution'メンバを変更していません。したがって、絶対に、他の関数では元の値*に戻ります。 – Mike

+2

私の最初のコメントが明確でない場合は、 'this => resolution = resolution;'を 'void GLWidget :: reception(QString resolution)'に追加するだけです。これはQt信号とスロットとは関係ありません。 – Mike

+0

問題を再現する完全で簡潔なテストケースを提供してください。複数のファイルは無関係です。すべてを1つの 'main.cpp'ファイルに最小化し、動作を変更しないものはすべて削除してください。おそらく、GUIアプリケーションである必要はありません。 –

答えて

0

私はあなたの問題を再現できませんでした。たぶん問題はあなたが共有していないコードの一部です。ただし、クラスのメンバと同じ名前のパラメータは使用しないでください。読書は混乱している。

0

メインウィンドウにプログラマチックに、またはフォームエディタを使用してGLWidgetを追加しましたか?

私は同様のコードを書いていますが、フォームエディタを使ってGLWidgetを追加し、メインウィンドウからGLWidgetにアクセスするためには、私はui-> glwidget-> ... .soを使う必要があります。おそらく2つのGLWidgetオブジェクト。メインウィンドウクラスにGLWidget変数が作成されていません。

関連する問題