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如何自定义设置滑块滑动区域?