c++ - 为什么任何事件(例如更改 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");
}
我已删除所有垫片,但我又遇到了这个问题
解决方案
推荐阅读
- shell - Unix wget | # 在网址中 | 语法问题
- typescript - 根据 TypeScript 中异步或同步的输入函数确定函数的类型安全返回值
- html - 使用 CSS Flex 跨越多个列
- r - R-Raster:将空间分辨率从 50 米提高到 30 米
- typescript - TypeScript:如何只允许特定类型作为方法参数
- xml - 使用 XSLT 转换带有逗号的 CSV 数据
- javascript - 通过递归实现的 JavaScript DOM 深度
- javascript - 在Javascript中递归组合和连接数组
- reactjs - 我如何从 Gatsby 的缓存中保存 js、css?
- machine-learning - 将图像数据集加载到 pytorch 中的数据加载器后,如何将图像数据集下载到我的电脑?