2016-10-20 18 views
1

こんにちは私はQt 5.7.0(MSVC 2013,32ビット)、Qt Creator 4.1.0 - コミュニティ版に基づいてQtを教えています。 Qt3に焦点を当てたMatthias Kalle Dalheimerの "Programming with Qt、2nd Edition"という本を使用しています。演習の1つは、LCD番号ディスプレイを使用するスライダを使用することです。スライダとLCDディスプレイを変更するための2つのボタン(加算、減算)もあります。私は、構文が大きく変わったので、本のコードを動作させることができませんでした。Qt3とQt5のプログラミング構文

私はQtデザイナーを使用して自分のコードを動作させることができましたが、それを使わずにコードを実行したいと思います。どうやってやるの?私はイベントの使用を考えていましたが、構文を理解できませんでした。

この本の抜粋です。

QObject::connect(decrement, SIGNAL(clicked()), myslider, SLOT(subtractStep())); 
QObject::connect(increment, SIGNAL(clicked()), myslider, SLOT(addStep())); 

これらはmain.cppに中に以下の私のコードのコンソールからのエラーメッセージは、次のとおりです。 は「QObjectを::を接続する:いいえ、そのようなスロットQSlider :: SingleStep().. \ ProgrammingQtの\ main.cppにで: 31 QObject :: connect:.. \ ProgrammingQt \ main.cppのQSlider :: triggerAction(SliderSingleStepAdd)はありません。

ここに私のコードはありません。 - main.cppにここ

#include <iostream> 

#include <qapplication.h> 
#include <qwidget.h> 
#include <qslider.h> 
#include <qlcdnumber.h> 
#include <qpushbutton.h> 
#include <qstring.h> 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    QApplication app(argc, argv); 

    QWidget *widget = new QWidget(); 
    widget->setGeometry(400, 300, 170, 150); 

    QSlider *slider = new QSlider(Qt::Horizontal, widget); 
    slider->setGeometry(10, 10, 150,30); 

    QLCDNumber *lcd = new QLCDNumber(2, widget); 
    lcd->setGeometry(60, 50, 50, 50); 
    lcd->display(1); 

    QObject::connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int))); 

    QPushButton *addBtn = new QPushButton("ADD ONE", widget); 
    addBtn->setGeometry(10, 110, 50, 30); 
    //QObject::connect(addBtn, SIGNAL(clicked(bool)), slider, SLOT(SliderSingleStepAdd())); 
    //QObject::connect(addBtn, SIGNAL(clicked(bool)), slider, SLOT(SingleStep())); 
    //QObject::connect(slider, SIGNAL(triggerAction(SliderSingleStepAdd)), lcd, SLOT(display(int))); 

    QPushButton *minusBtn = new QPushButton("MINUS ONE", widget); 
    minusBtn->setGeometry(100, 110, 60, 30); 
    // QObject::connect(minusBtn, SIGNAL(clicked(bool)), slider, SLOT (SliderSingleStepSub())); 

    QObject::connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int))); 

    widget->setWindowTitle("LCD Number"); 
    widget->show(); 
    return app.exec(); 
} 

は、Qtのデザイナを使用してコードである:mainwindow.cpp

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

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

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

void MainWindow::on_slider_valueChanged(int value) 
{ 
    ui->lcd->display(value); 
} 

void MainWindow::on_addBtn_clicked() 
{ 
    int incVal = ui->slider->value(); 
    incVal++; 
    ui->slider->setValue(incVal); 
    ui->lcd->display(incVal); 
} 

void MainWindow::on_minusBtn_clicked() 
{ 
    int decVal = ui->slider->value(); 
    decVal--; 
    ui->slider->setValue(decVal); 
    ui->lcd->display(decVal); 
} 

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QSlider> 
#include <QLCDNumber> 

namespace Ui { 
    class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

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

    private slots: 

    void on_slider_valueChanged(int value); 

    void on_addBtn_clicked(); 
    void on_minusBtn_clicked(); 

private: 
    Ui::MainWindow *ui; 
}; 

#endif // MAINWINDOW_H 
+2

QT3は、それがここにQT3帳を使用しようとし、おそらく非常に便利ではありません... Qt4を帳がうまくいくことを、Qt4をとQt5大差でしたソースはQt4と互換性があります。しかし、Qt5では多くのことを行うための新しい優れた方法が導入されています。 – hyde

+0

残念ながら、私の地元図書館には新しいQTの本はありませんでした。 – jmjiru

+2

QtはQt 5とQt 4で利用可能な素晴らしいオンラインドキュメントを持っています – demonplus

答えて

0

スロットSliderSingleStepAddSingleStep又はSliderSingleStepSubが見つかりませんオブジェクトsliderに定義されていないためです。ドキュメントへ

According、QObjectをまたはそのサブクラスの1つ(例えば、 QWidgetの)継承

すべてのクラスは、シグナルとスロットを含むことができます。

したがって、必要な信号とスロットを実装する必要があるクラスが必要です。 、(スライダー私の意見では

#ifndef MYCLASS_H 
#define MYCLASS_H 

#include <iostream> 
#include <QObject> 

class MyClass : public QObject 
{ 
    Q_OBJECT 

public: 
    MyClass(): QObject() {} 
    virtual ~MyClass() {} 

    public slots: 
    void SliderSingleStepAdd() 
    { 
     std::cout << "SliderSingleStepAdd" << std::endl; 
    } 

    void SingleStep() 
    { 
     std::cout << "SingleStep" << std::endl; 
    } 

    void SliderSingleStepSub() 
    { 
     std::cout << "SliderSingleStepSub" << std::endl; 
    } 

}; 

#endif // MYCLASS_H 

、すべてのオブジェクト:

はたとえば、あなたのメインは、このようなものでなければなりません:

#include <iostream> 

#include <qapplication.h> 
#include <qwidget.h> 
#include <qslider.h> 
#include <qlcdnumber.h> 
#include <qpushbutton.h> 
#include <qstring.h> 
#include <myclass.h> 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    QApplication app(argc, argv); 

    MyClass myClass; 

    QWidget *widget = new QWidget(); 
    widget->setGeometry(400, 300, 170, 150); 

    QSlider *slider = new QSlider(Qt::Horizontal, widget); 
    slider->setGeometry(10, 10, 150,30); 

    QLCDNumber *lcd = new QLCDNumber(2, widget); 
    lcd->setGeometry(60, 50, 50, 50); 
    lcd->display(1); 

    QObject::connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int))); 

    QPushButton *addBtn = new QPushButton("ADD ONE", widget); 
    addBtn->setGeometry(10, 110, 50, 30); 
    QObject::connect(addBtn, SIGNAL(clicked(bool)), &myClass, SLOT(SliderSingleStepAdd())); 
    QObject::connect(addBtn, SIGNAL(clicked(bool)), &myClass, SLOT(SingleStep())); 
    // QObject::connect(slider, SIGNAL(triggerAction(SliderSingleStepAdd)), lcd, SLOT(display(int))); 

    QPushButton *minusBtn = new QPushButton("MINUS ONE", widget); 
    minusBtn->setGeometry(100, 110, 60, 30); 
    QObject::connect(minusBtn, SIGNAL(clicked(bool)), &myClass, SLOT(SliderSingleStepSub())); 

    QObject::connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int))); 

    widget->setWindowTitle("LCD Number"); 
    widget->show(); 
    return app.exec(); 
} 

そして、あなたは、次のようなクラスを持っている必要がありますlcd、およびbuttons)は、QWidgetから継承するクラスに存在する必要があります。これは、次の接続の場合にも必要でなければなりません:Qt5がほとんどであるため、

QObject::connect(slider, SIGNAL(triggerAction(SliderSingleStepAdd)), lcd, SLOT(display(int))); 
関連する問題