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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT中,我想使用QSlider设置的值,应该怎么写信号槽?相关的知识,希望对你有一定的参考价值。

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

经典的观察者模式在讲解举例的时候通常会举报纸和订阅者的例子。有一个报纸类Newspaper,有一个订阅者类Subscriber。Subscriber可以订阅Newspaper。这样,当Newspaper有了新的内容的时候,Subscriber可以立即得到通知。在这个例子中,观察者是Subscriber,被观察者是Newspaper。在经典的实现代码中,观察者会将自身注册到被观察者的一个容器中(比如subscriber.registerTo(newspaper))。被观察者发生了任何变化的时候,会主动遍历这个容器,依次通知各个观察者(newspaper.notifyAllSubscribers())。
下面我们看看使用 Qt 的信号槽,如何实现上述观察者模式。注意,这里我们仅仅是使用这个案例,我们的代码并不是去实现一个经典的观察者模式。也就是说,我们使用 Qt 的信号槽机制来获得同样的效果。
参考技术A connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(sssslot(int)));

void sssslot(int value)

.....
//value即为Slider一有变化后的数值
本回答被提问者采纳
参考技术B 第三章 预应力钢筋混凝土梁(建议5学时)
了解先张、后张预应力钢筋混凝土简支梁的标准设计;了解预应力钢筋混凝土简支梁的类型及特点;理解张拉锚固体系的类型及发展;掌握预应力钢筋混凝土梁的钢筋类型;理解预应力钢筋混凝土梁的钢筋布置方法,并能够独立识图;掌握铁路预应力钢筋混凝土梁的尺寸拟定规定;了解先张预应力钢筋混凝土简支梁的工作原理及施工工艺;了解部分预应力混凝土梁、预应力混凝土槽形梁、整孔式预应力混凝土简支梁、双预应力混凝土简支梁、横向分块式预应力混凝土简支梁及预弯预应力混凝土简支梁的特点;理解后张法预应力钢筋混凝土简支梁的极限状态设计方法;了解后张法预应力钢筋混凝土简支梁的疲劳能力检算;掌握后张法预应力钢筋混凝土简支梁纵向预应力筋及箍筋布置;理解锚下应力分析及配筋;了解预应力混凝土简支梁的制造与架设方法。

第四章 桥梁支座(建议3学时)
理解桥梁支座的作用;掌握桥梁支座的分类;掌握桥梁支座的布置原则;了解板式橡胶支座的构造;理解板式橡胶支座的工作机理;了解板式橡胶支座的计算内容;理解盆式橡胶支座的构造;了解盆式橡胶支座的计算内容;理解钢支座的类型及特点;了解其他类型桥梁支
参考技术C

参考技术D 不知道.............................

GUI 编程 —— QT 的 QSlider 鼠标点击定位问题

这几天打算封装 libvlc 实现一个简单的播放器操作类,用 QT 写 UI 测试程序的时候,发现播放进度的显示控件 QSlider 在处理鼠标点击时,并不能直接定位到鼠标按下的位置。为解决这一问题,我在网上看了几篇博文提供的解决办法,但实现的效果并不理想,主要的问题是:鼠标点击定位时,出现位置偏差。鉴于这,我提供了如下的解决办法。

1. 为 QSlider 控件设置事件过滤

在 QSlider 控件父窗口初始化的时候设置(比如我的代码中就在 Widget 构造函数中设置):

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

    ......
    ui->hSlider_duration->installEventFilter(this);
    ......
    ui->hSlider_volume->installEventFilter(this);
    ......
}

2. 重载 eventFilter() 接口

对 QSlider 控件的父级窗口重载 eventFilter() 接口,然后针对 鼠标左键的按下事件 进行过滤判断操作:

bool Widget::eventFilter(QObject * watched, QEvent * event)
{
    if ((event->type() == QEvent::MouseButtonPress) &&
        ((watched == ui->hSlider_duration) || (watched == ui->hSlider_volume)))
    {
        on_slider_mouseLButtonPress(watched, event);
    }

    return QWidget::eventFilter(watched, event);
}

3. 计算点击定位的 value

void Widget::on_slider_mouseLButtonPress(QObject * slider, QEvent * event)
{
    do
    {
        //======================================
        // 只处理 鼠标左键 的按下事件

        QSlider     * sliderCtrl = static_cast< QSlider     * >(slider);
        QMouseEvent * mouseEvent = static_cast< QMouseEvent * >(event );
        if (Qt::LeftButton != mouseEvent->button())
        {
            break;
        }

        //======================================
        // 确定控件操作的基本参数

        int cxctl = 0;  // 滑块宽度
        int cxwnd = 0;  // 滑槽长度
        int mxpos = 0;  // 鼠标按下的位置

        if (Qt::Horizontal == sliderCtrl->orientation())
        {
            // 水平样式的 slider
            cxctl = sliderCtrl->minimumSizeHint().width();
            cxwnd = sliderCtrl->width();
            if (sliderCtrl->invertedAppearance())
                mxpos = cxwnd - mouseEvent->x();
            else
                mxpos = mouseEvent->x();
        }
        else
        {
            // 垂直样式的 slider
            cxctl = sliderCtrl->minimumSizeHint().height();
            cxwnd = sliderCtrl->height();
            if (sliderCtrl->invertedAppearance())
                mxpos = mouseEvent->y();
            else
                mxpos = cxwnd - mouseEvent->y();
        }

        if (cxwnd <= cxctl)
        {
            break;
        }

        //======================================
        // 计算结果,并设置新计算得到的 position 值

        int scpos = sliderCtrl->minimum() +
                    (int)((sliderCtrl->maximum() - sliderCtrl->minimum()) *
                          ((mxpos - cxctl / 2.0) / (cxwnd - cxctl)));

        if (sliderCtrl->sliderPosition() == scpos)
        {
            break;
        }

        sliderCtrl->setSliderPosition(scpos);

        //======================================

    } while (0);
}

4. 头文件中 Widget 类的接口声明如下:

class Widget : public QWidget
{
    ......

    // overrides
protected:
    virtual bool eventFilter(QObject * watched, QEvent * event);

    // inner invoking
protected:
    void on_slider_mouseLButtonPress(QObject * slider, QEvent * event);

    ......
};

另外,我的 libvlc 播放器封装类也完成了,在另外一篇文章中
libvlc —— 播放器示例程序[C++代码实现攫取 RGB图像 和 PCM音频 数据功能]

以上是关于QT中,我想使用QSlider设置的值,应该怎么写信号槽?的主要内容,如果未能解决你的问题,请参考以下文章

Qt之QSlider的使用方法

如何使 QSlider 只读?

请教个Qt相关问题:对于QSlider如何自定义设置滑块滑动区域?

GUI 编程 —— QT 的 QSlider 鼠标点击定位问题

QT软件开发: 设置QSlider样式

Qt之自定义带游标的QSlider