首页 > 解决方案 > 为什么任何事件(例如更改 QLabel 或 QPushButton 的文本)将移动的小部件恢复到它在布局中的第一个位置?

问题描述

我在 Qt 程序中从 QpushButton 扩展了一个类,它覆盖了 mousepress 和 mousemove 事件,并导致父小部件在布局中通过鼠标左键单击移动。但是当我在父小部件中更改某些小部件的属性时,例如 QLabel 的文本或 QpushButton 的文本,父小部件会回到布局中的原始位置,我的代码有什么问题以及如何防止这种情况发生?任何帮助表示赞赏

这是我的代码:

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

   MoveButton *movebut = new MoveButton(this);
   ui->horizontalLayout->addWidget(movebut);

   connect(movebut , &MoveButton::positionChanged , ui->widgetMove , [this](const QPoint &newPos){
       ui->widgetMove->move(ui->widgetMove->mapToParent(newPos));
       currentPos = mapToParent(newPos);;
   });
}

MainWidget::~MainWidget()
{
   delete ui;
}

MoveButton::MoveButton(QWidget *parent) : QPushButton(parent)
{
   setText("Draggable Button");
   setMouseTracking(true);
   setContentsMargins(0 , 0 , 0 , 0);
   setMaximumHeight(30);
}

QSize MoveButton::minimumSizeHint() const
{
   return QSize(100 ,30);
}

void MoveButton::mousePressEvent(QMouseEvent *event)
{
   if (event->button() == Qt::LeftButton)
   {
       offset = event->pos();
       qDebug() << offset;
   }
}

void MoveButton::mouseMoveEvent(QMouseEvent *event)
{
   //this->setCursor(Qt::OpenHandCursor);
   if(event->buttons() & Qt::LeftButton)
   {
       emit positionChanged(event->pos() - offset);
   }
}

void MainWidget::on_pushButton_clicked()
{
   ui->pushButton->setText("Clicked");
}

初始状态

拖动后

点击后

我已删除所有垫片,但我又遇到了这个问题

标签: c++qtqt-designer

解决方案


推荐阅读