2017-10-01 4 views
1

私はQtとC++の新機能です。私は少し摂氏/華氏のコンバータをやろうとしました。 UIで私はQDialとQLCDNumberを使って温度をそれぞれ変更して表示します。 は、残念ながら、唯一の「標準接続」は作品:Qt connect(* sender、* signal、* receiver、* method)はスロットを呼び出さない

connect(ui->celsiusDial, SIGNAL(valueChanged(int)), ui->celsiusLcd,SLOT(display(int))); 

ダイヤルスピニングLCD-ウィジェットに変化をもたらすが、何かが動作しない(ダイアログで呼び出し)...(接続参照してください。 CPP

プロジェクトtempconverter.cppクラスを呼び出す名前]ダイアログでQWidgetのを持っている Dialog.cpp:。。

#include "dialog.h" 
#include "ui_dialog.h" 
#include "tempconverter.h" 

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

    TempConverter tempConverterObject(0, this); 
    TempConverter * tempConverter = &tempConverterObject; 


    connect(ui->celsiusDial, SIGNAL(valueChanged(int)), tempConverter, SLOT(setTempCelsius(int))); 

    connect(ui->celsiusDial, SIGNAL(valueChanged(int)), ui->celsiusLcd, SLOT(display(int))); 
    connect(tempConverter, SIGNAL(tempCelsiusChanged(int)), ui->celsiusDial, SLOT(setValue(int))); 

    connect(ui->fahrenheitDial, SIGNAL(valueChanged(int)), tempConverter, SLOT(setTempFahrenheit(int))); 

    connect(ui->fahrenheitDial, SIGNAL(valueChanged(int)), ui->fahrenheitLcd, SLOT(display(int))); 
    connect(tempConverter, SIGNAL(tempFahrenheitChanged(int)), ui->fahrenheitDial, SLOT(setValue(int))); 

} 

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

ここに私のTempConverterクラスだ:

ヘッダー:tempconverter.h

#ifndef TEMPCONVERTER_H 
#define TEMPCONVERTER_H 

#include <QObject> 

class TempConverter : public QObject 
{ 
    Q_OBJECT 
public: 
    TempConverter(int tempCelsius, QObject *parent = 0); 

    int tempCelsius() const; // const is signature for getters!(that's why they are blue!) 
    int tempFahrenheit() const; 

public slots: 
    void setTempCelsius(int); 
    void setTempFahrenheit(int); 

signals: 
    void tempCelsiusChanged(int); // Signals are only declared not "implemented", they are emitted when a event occurs 
    void tempFahrenheitChanged(int); // Signals are only declared not "implemented", they are emitted when a event occurs 

private: 
    int m_tempCelsius; // internal representation of celsiusTemp <=> Java Attribute 
}; 

#endif // TEMPCONVERTER_H 

クラス:tempconverter.cpp

#include "tempconverter.h" 
#include <QDebug> 

TempConverter::TempConverter(int tempCelsius, QObject *parent) : QObject(parent) // this is the constructor 
{ 
    qDebug("default constructor"); 
    m_tempCelsius = tempCelsius; 
} 


void TempConverter::setTempCelsius(int tempCelsius) 
{ 
    //qDebug("setTempCelsius"); 
    if(m_tempCelsius == tempCelsius) 
     return; 
    m_tempCelsius = tempCelsius; 

    emit tempCelsiusChanged(m_tempCelsius); 
    emit tempFahrenheitChanged(tempFahrenheit()); 


} 

void TempConverter::setTempFahrenheit(int tempFahrenheit){ 
    qDebug("setTempFahrenheit"); 
    int tempCelsius = (5.0/9.0)*(tempFahrenheit-32); 
    setTempCelsius(tempCelsius); 
    qDebug("setTempFahrenheit"); 
} 

int TempConverter::tempCelsius() const{ 
    return m_tempCelsius; 
} 

int TempConverter::tempFahrenheit() const{ 
    return (m_tempCelsius*2)+30; 
} 

そして最後に、私のUIは、次のようになります。dialog.ui

事前に
<?xml version="1.0" encoding="UTF-8"?> 
<ui version="4.0"> 
<class>Dialog</class> 
<widget class="QDialog" name="Dialog"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>400</width> 
    <height>300</height> 
    </rect> 
    </property> 
    <property name="windowTitle"> 
    <string>Dialog</string> 
    </property> 
    <widget class="QWidget" name=""> 
    <property name="geometry"> 
    <rect> 
    <x>30</x> 
    <y>40</y> 
    <width>331</width> 
    <height>231</height> 
    </rect> 
    </property> 
    <layout class="QGridLayout" name="gridLayout"> 
    <item row="0" column="0"> 
    <widget class="QGroupBox" name="groupBox"> 
     <property name="title"> 
     <string>Celsius</string> 
     </property> 
     <widget class="QDial" name="celsiusDial"> 
     <property name="geometry"> 
     <rect> 
     <x>0</x> 
     <y>30</y> 
     <width>161</width> 
     <height>141</height> 
     </rect> 
     </property> 
     </widget> 
     <widget class="QLCDNumber" name="celsiusLcd"> 
     <property name="geometry"> 
     <rect> 
     <x>3</x> 
     <y>172</y> 
     <width>161</width> 
     <height>41</height> 
     </rect> 
     </property> 
     </widget> 
    </widget> 
    </item> 
    <item row="0" column="1"> 
    <widget class="QGroupBox" name="groupBox_2"> 
     <property name="title"> 
     <string>Fahrenheit</string> 
     </property> 
     <widget class="QDial" name="fahrenheitDial"> 
     <property name="geometry"> 
     <rect> 
     <x>0</x> 
     <y>20</y> 
     <width>161</width> 
     <height>141</height> 
     </rect> 
     </property> 
     </widget> 
     <widget class="QLCDNumber" name="fahrenheitLcd"> 
     <property name="geometry"> 
     <rect> 
     <x>0</x> 
     <y>170</y> 
     <width>161</width> 
     <height>41</height> 
     </rect> 
     </property> 
     </widget> 
    </widget> 
    </item> 
    </layout> 
    </widget> 
</widget> 
<layoutdefault spacing="6" margin="11"/> 
<resources/> 
<connections/> 
</ui> 

おかげで、私は本当にどこからエラーが来るのか分からない。

+0

私はあなたがするので、無限ループを作成していると思います'celsiusDial :: valueChanged'がシグナルを送出すると、' tempConverter :: setTempCelsius'を受け取り、それを 'celsiusDial :: setValue'に送出し、これが返されてシグナルを送出し、無限ループを生成します。 'fahrenheitDial'でも同じことが言えます。それが正しいロジックだと思いますか? – eyllanesc

+0

入力いただきありがとうございますeyllanesc! if(m_tempCelsius == tempCelsius) return; この条件で無限ループを停止してはいけませんか? これがなければ私ははいと言うでしょう。 * qDebug *が決して呼び出されない(私はコメントしていません)ので、スロットが決して呼び出されないようです。しかし、私はなぜわからない –

答えて

1

問題は、tempConverterObject変数がそのコンテキストで作成された、つまりローカル変数であり、その関数が実行されたときにメモリから削除されているためです。ソリューションは、クラスのメンバにその変数を変換することです:

* .hの

private: 
    Ui::Dialog *ui; 
    TempConverter *tempConverter; 

* .cppファイル

Dialog::Dialog(QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::Dialog) 
{ 
    ui->setupUi(this);  
    tempConverter = new TempConverter(0, this); 
    connect(ui->celsiusDial, SIGNAL(valueChanged(int)), tempConverter, SLOT(setTempCelsius(int))); 

    connect(ui->celsiusDial, SIGNAL(valueChanged(int)), ui->celsiusLcd, SLOT(display(int))); 
    connect(tempConverter, SIGNAL(tempCelsiusChanged(int)), ui->celsiusDial, SLOT(setValue(int))); 

    connect(ui->fahrenheitDial, SIGNAL(valueChanged(int)), tempConverter, SLOT(setTempFahrenheit(int))); 

    connect(ui->fahrenheitDial, SIGNAL(valueChanged(int)), ui->fahrenheitLcd, SLOT(display(int))); 
    connect(tempConverter, SIGNAL(tempFahrenheitChanged(int)), ui->fahrenheitDial, SLOT(setValue(int))); 

} 
+0

それはそれだ!早々に返事をくれてありがとう! また、説明のために大きな感謝、あなたがそれを言う今かなり簡単なようです! :) –

関連する問題