2016-10-20 42 views
1

您好我正在教導自己Qt基於Qt 5.7.0(MSVC 2013,32位),Qt Creator 4.1.0 - 社區版。我正在使用Matthias Kalle Dalheimer編寫的一本書,「使用Qt編程,第2版」,重點介紹QT3。其中一個練習是使用LCD號碼顯示的滑塊。還有兩個按鈕(添加,減去)來更改滑塊和LCD顯示。由於主要的語法更改,我無法使書代碼正常工作。Qt3 vs Qt5編程語法

我能夠讓我的代碼使用Qt設計器工作,但我想這樣做也沒有。我怎樣才能做到這一點?我正在考慮使用事件,但我無法弄清楚語法。

這是本書的摘錄。

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

這些是從控制檯中的錯誤消息下面我的代碼中的main.cpp: 「的QObject ::連接:沒有這樣的槽QSlider ::單步()中.. \ ProgrammingQt \ main.cpp中: 31 QObject :: connect:沒有這樣的信號QSlider :: triggerAction(SliderSingleStepAdd)in .. \ ProgrammingQt \ main.cpp:32「

這是我沒有ui的代碼。 - 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設計的代碼:未發現SliderSingleStepAddSingleStepSliderSingleStepSub 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是從Qt4的和QT5等不同,它可能不是非常有用試圖在這裏使用QT3書... Qt4的書會的工作,因爲QT5幾乎是與Qt4兼容。但是Qt5引入了新的優秀方式來做很多事情,所以您花時間從Qt5材料中學習會更好。 – hyde

+0

不幸的是,我的本地圖書館沒有任何更新的QT書籍。 – jmjiru

+2

Qt爲Qt 5和Qt 4提供了很棒的在線文檔。 – demonplus

回答

0

槽因爲對象slider中沒有定義。

According到的文檔,

該繼承QObject或它的子類(例如, QWidget的)中的一個的所有類可以包含信號和槽。

所以你需要一個類,你必須實現你所需要的信號和插槽。

例如,你的主要應該是這樣的:

#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(); 
} 

而且你應該有類似以下的類:

#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 

在我看來,所有對象(滑塊,液晶顯示器和按鈕)應該在從QWidget繼承的類中,以便可以連接這些對象。這應該是還需要在以下情況下以下連接:

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