Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 动态更改qlabel的位置_C++_Qt - Fatal编程技术网

C++ 动态更改qlabel的位置

C++ 动态更改qlabel的位置,c++,qt,C++,Qt,我是QT编程的新手,我有一个问题。我有一个qslider和qlabel,还有一个视频播放。当视频播放时,qslider的滴答声正在向前移动,你们可以猜到。我想做的是将qlabel放在qslider的勾号下面,并在qlabel的文本更新时将其与勾号一起移动…首先,您可以尝试qlabel.setIndent(self,int),只要勾号更改,就调用它。如果这对您有效,那么这是最简单的可能性,如果没有,请重新发布。您不能将QLavel“移动”到整个小部件上,因为:小部件存在于布局中。 因此,如果你只想

我是QT编程的新手,我有一个问题。我有一个qslider和qlabel,还有一个视频播放。当视频播放时,qslider的滴答声正在向前移动,你们可以猜到。我想做的是将qlabel放在qslider的勾号下面,并在qlabel的文本更新时将其与勾号一起移动…

首先,您可以尝试qlabel.setIndent(self,int),只要勾号更改,就调用它。如果这对您有效,那么这是最简单的可能性,如果没有,请重新发布。

您不能将QLavel“移动”到整个小部件上,因为:小部件存在于布局中。 因此,如果你只想垂直或水平地“移动”你的标签,那么几乎没有办法解决你的问题

最简单的方法是使用
QLabel::setIndent
函数(它将在
QLabel
中“移动”文本):

如果标签显示文本,则如果alignment()为Qt::AlignLeft,缩进将应用于左边缘;如果alignment()为Qt::AlignRight,缩进将应用于右边缘;如果alignment()为Qt::AlignTop,缩进将应用于上边缘;如果alignment()为Qt::AlignBottom,缩进将应用于下边缘

您也可以尝试这种方式(它将“移动”
QLabel
本身):

  • 创建方框布局(
    QHBoxLayout
    QVBoxLayout
  • 添加拉伸(调用
    QBoxLayout::addStretch
  • 添加QLabel(调用
    QLayout::addWidget
  • 再次添加拉伸
  • 然后可以更改“移动”模拟的拉伸因子
  • 初始拉伸因子的值将定义标签的初始位置

    模拟QLabel从左向右移动的代码示例:

    class MyWidget : public QWidget
    {
      Q_OBJECT
    
    public:
      MyWidget(QWidget* parent) : QWidget(parent)
      {
        layout_ = new QHBoxLayout(this);
        layout_->addStretch();
        layout_->addWidget(new QLabel("Moving text", this));
        layout_->addStretch(100);
    
        connect(&timer_, SIGNAL(timeout()), SLOT(moveLabel()));
        timer_.start(1000);
      }
    
    public slots:
      void moveLabel()
      {
        layout_->setStretch(0, layout_->stretch(0) + 1);
        layout_->setStretch(1, layout_->stretch(1) - 1);
    
        if(layout_->stretch(0) == 100)
          timer_.stop();
      }
    
    private:
      QBoxLayout* layout_;
      QTimer timer_;
    };
    

    另一种情况是继承
    QSlider
    ,然后重新实现受保护的函数
    QWidget::paintEvent
    ,以便在滑块上绘制一些标签。

    谢谢,但是QLabel.setIndent(self,int)中的self是什么呢,在这种方法和其他方法中,它们使用self作为第一个参数。我的解释是,这是一个隐式参数,由消息的接收者给出,就像Python中一样。因此,我认为只要调用qlabel.setIndent(int)就可以了。“yourQLabel”是第一个(隐式)参数。您也可以使用setGeometry更改其在对话框中的位置。。。