QT中,我想使用QSlider设置的值,应该怎么写信号槽?

QT中,我想使用QSlider设置的值,应该怎么写信号槽?,第1张

上一节我们详细分析了connect()函数。使用connect()可以让我们连接系统提供的信号和槽。但是,Qt 的信号槽机制并不仅仅是使用系统提供的那部分,还会允许我们自己设计自己的信号和槽。这也是 Qt 框架的设计思路之一,用于我们设计解耦的程序。本节将讲解如何在自己的程序中自定义信号槽。

信号槽不是 GUI 模块提供的,而是 Qt 核心特性之一。因此,我们可以在普通的控制台程序使用信号槽。

经典的观察者模式在讲解举例的时候通常会举报纸和订阅者的例子。有一个报纸类Newspaper,有一个订阅者类Subscriber。Subscriber可以订阅Newspaper。这样,当Newspaper有了新的内容的时候,Subscriber可以立即得到通知。在这个例子中,观察者是Subscriber,被观察者是Newspaper。在经典的实现代码中,观察者会将自身注册到被观察者的一个容器中(比如subscriber.registerTo(newspaper))。被观察者发生了任何变化的时候,会主动遍历这个容器,依次通知各个观察者(newspaper.notifyAllSubscribers())。

下面我们看看使用 Qt 的信号槽,如何实现上述观察者模式。注意,这里我们仅仅是使用这个案例,我们的代码并不是去实现一个经典的观察者模式。也就是说,我们使用 Qt 的信号槽机制来获得同样的效果。

Qt中创建一个槽并将其关联到指定的信号上

创建一个槽有两种方法。

一种是在类的头文件中,声明:

private slots:

void testSlot(QString message)    //自定义的槽

然后在类的cpp文件中实现该槽。

要想关联信号,必须使用SIGNAL和SLOT宏。

第二种方法是利用函数指针的形式。这时的槽函数可以是任意函数。在connect函数中,只要使用&函数指针即可。

SpinBox、DoubleSpinBox、Slider三个控件的基本介绍不在这儿细讲,网上有很多相关的概念,这篇文章主要介绍,三者之间的信号槽设置。 

首先创建Qt5的Gui项目, 

如图:

然后鼠标双击mainwindow.ui,进入页面设计界面,在选择右侧的工具栏,选择空间SpinBox,DoubleSpinBox,Horizontal Slider,构建出如下布局: 

 

创建完这四个空间后,可以更改空间的对象名称,便于调用。 

首先确定要实现的信号槽目标: 

1、改变spinBox,HorizontalSlider的值改变;改变HorizontalSlider的值,spinBox的值改变 

2、改变doubleSpinBox,HorizaontalSlider_2的值改变;改变HorizontalSlider_2的值,DoubleSpinBox改变。

首先先介绍最简单的信号槽设置方式,以spinBox、HorizontalSlider为例,在设计界面,点击 

 

添加SpinBox和HorizontalSlider的信号槽映射, 

如图

 

点击确定后,就建立了HorizontalSlider到SpinBox信号链接,同样地,建立Spinbox到HorizontalSlider的连接。 

最终显示如图: 

 

点击左侧运行,可以看到结果: 

接下来,介绍另一种信号槽设置方式, 

打开mainwindow.h, 

添加如下代码:

private slots:    void slotDoubleSpinbox_slider()   void slotslider_DoubleSpinBox()123

因此,最终的mainwindow.h的文件如下:

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>namespace Ui {

class MainWindow

}

class MainWindow : public QMainWindow

{

Q_OBJECTpublic:    explicit MainWindow(QWidget *parent = 0)

~MainWindow()private:

Ui::MainWindow *uiprivate slots://槽函数声明    void slotDoubleSpinbox_slider()   void slotslider_DoubleSpinBox()

}#endif // MAINWINDOW_H123456789101112131415161718192021222324

声明完槽函数,就需要对槽函数进行信号连接,打开mainwindow.cpp文件,在mainwindow构造函数中增加信号和槽的映射

MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent),

ui(new Ui::MainWindow)

{

ui->setupUi(this)

connect(ui->doubleSpinBox, SIGNAL(valueChanged(double)), this, SLOT(slotDoubleSpinbox_slider()))   connect(ui->horizontalSlider_2, SIGNAL(valueChanged(int)), this, SLOT(slotslider_DoubleSpinBox()))

}12345678

接下来,实现槽函数功能:

void MainWindow::slotDoubleSpinbox_slider()

{

ui->horizontalSlider_2->setValue((int)(ui->doubleSpinBox->value()*100))

}void MainWindow::slotslider_DoubleSpinBox()

{

ui->doubleSpinBox->setValue((double)(ui->horizontalSlider_2->value())/100)

}12345678

至此,就建立了DoubleSpinBox和Horizontal Slider的信号槽,点击运行,可以看到结果:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11865713.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存