首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt3与Qt5编程语法

Qt3与Qt5编程语法
EN

Stack Overflow用户
提问于 2016-10-20 13:20:34
回答 1查看 464关注 0票数 1

嗨,我正在自学基于Qt 5.7.0 (MSVC 2013,32位)的Qt,Qt Creator 4.1.0 -社区版。我使用的是一本书,“用Qt编程,第二版”,作者是Matthias Kalle Dalheimer,它的重点是QT3。其中一个练习是使用LCD数字显示器的滑块。还有两个按钮(add、subtract)可用于更改滑块和LCD显示。我不能让书中的代码工作,因为有很大的语法变化。

我能够让我的代码使用Qt设计器工作,但我也想在没有它的情况下这样做。我该怎么做呢?我正在考虑使用事件,但是我不知道它的语法。

这是这本书中的一些片段。

代码语言:javascript
复制
QObject::connect(decrement, SIGNAL(clicked()), myslider, SLOT(subtractStep()));
QObject::connect(increment, SIGNAL(clicked()), myslider, SLOT(addStep()));

以下是来自控制台的错误消息,适用于以下main.cpp中的代码:“..\ProgrammingQt\main.cpp:31中的QObject::connect: No the QSlider::SingleStep()in ..\ProgrammingQt\main.cpp:32中的QSlider::connect: No the QSlider::triggerAction(SliderSingleStepAdd)”

这是我的代码,没有ui。- main.cpp

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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
EN

回答 1

Stack Overflow用户

发布于 2016-10-20 16:56:34

由于未在object slider中定义插槽SliderSingleStepAddSingleStepSliderSingleStepSub,因此找不到它们。

文档的According

从QObject或其子类之一(例如,QWidget)继承的所有类都可以包含信号和槽。

所以你需要一个类,在这个类中你必须实现你需要的信号和槽。

例如,main应该是这样的:

代码语言:javascript
复制
#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();
}

你应该有一个像下面这样的类:

代码语言:javascript
复制
#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的类中,这样你就可以连接这些对象了。在执行以下连接的情况下,这也是必要的:

代码语言:javascript
复制
QObject::connect(slider, SIGNAL(triggerAction(SliderSingleStepAdd)), lcd, SLOT(display(int)));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40146025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档