为什么QSlider不立即在其UI中更新其位置?

时间:2018-09-06 07:52:48

标签: c++ qt

我正在创建一个视频应用程序。

启动此应用后,您会在屏幕上看到一个VideoWidget循环播放列表以及其他窗口小部件。通过单击VideoWidget,VideoWidget将进入全屏模式,并在其上方放置一个音量滑块。如果在全屏模式下再次单击,它将显示为正常。

为此,我创建了2个类。首先,我创建了一个主类,其中包含所有小部件,包括视频小部件。其次,我创建了一个自定义VideoWidget类。我在这个VideoWidget类中实例化了Qslider,并在我的主类中实例化了一个VideoWidget对象,该对象的对象已在main.cpp中实例化。

我实现了预期的目标。除非滑块不会立即更新其位置。如果您单击以显示正常,然后单击以全屏返回,则只会更新位置。在全屏模式下,音量会改变,但UI中的滑块位置不会改变。

我想问我做错了什么?我应该怎么做才能在UI中更新滑块位置?

代码段: 在VideoWidget.h中

class VideoWidget : public QVideoWidget
{
Q_OBJECT
QVideoWidget* videoWidget;

QMediaPlaylist* playlist;
QMediaPlayer *player;
public:
VideoWidget();
QSlider* slider;
};

在VideoWidget.cpp中

VideoWidget::VideoWidget()
: videoWidget(new QVideoWidget(this)),
  slider(new QSlider(Qt::Horizontal, this))
{
/*QMediaplaylist *playlist, QMediaPlayer *player instantiated here*/
  slider->hide();
  slider->setGeometry(300,735,600,20);
  slider->setRange(0, 100);
  slider->setValue(player->volume());

  connect(slider, &QSlider::valueChanged, player, &QMediaPlayer::setVolume);
 }

void VideoWidget::changeEvent(QEvent *event)
{
if(event->type() == QEvent::WindowStateChange)
    slider->setVisible(windowState() == Qt::WindowFullScreen);
QWidget::changeEvent(event);

}
enter code here
void VideoWidget::resizeEvent(QResizeEvent* event) {
videoWidget->resize(size());
event->accept();
}

void VideoWidget::mousePressEvent(QMouseEvent *event)
{
this->setFullScreen(!isFullScreen());
event->accept();
}

在MainWidget.cpp中

mainwidget::mainwidget(QWidget *parent)
: QWidget(parent)

{
 videoWidget = new VideoWidget(); // the video container
 videoWidget->setFixedSize(500, 300);

 QBoxLayout *displayLayout = new QHBoxLayout;
 displayLayout->addWidget(videoWidget, 2);

 QBoxLayout *layout = new QVBoxLayout;
 layout->addLayout(displayLayout);
 setLayout(layout);

 videoWidget->setGeometry(100,100,300,400);
 videoWidget->show();
}

编辑: 这是启动时播放我的手部视频的应用程序。 enter image description here

当我单击视频时, enter image description here

视频设置为全屏,并出现滑块。滑块可以控制媒体播放器的音量,但问题是,拖动时它不会移动。

1 个答案:

答案 0 :(得分:0)

您在描述问题所在的方式上非常困惑,但是如果我没问题,QSlider不会跟踪鼠标,但是您可以通过单击来更改音量,大概是单击一下即可。

您已连接valueChanged信号,如果sliderReleased()属性为tracking,则该信号仅在false之后发出。如果要连续调节音量,则必须处理Pressed \ Moved \ Released组信号,或者可以使用QSlider的内置功能(通常就足够了):

slider->setTracking(true);