gpt4 book ai didi

qt - 将 QSizeGrip 添加到 QLabel 的角落

转载 作者:行者123 更新时间:2023-12-01 05:33:47 25 4
gpt4 key购买 nike

我正在尝试生成一个小部件,其中包含一个文本显示,用户可以通过捕获右下角来调整其大小。到目前为止,我已经能够生成这个:

enter image description here

我在布局中应用了红色背景,以使发生的事情更加明显。我使用以下代码来生成它:

  m_sizeGrip = new QSizeGrip( this );
m_layout = new QHBoxLayout( this );
m_label = new QLabel( this );

m_layout->setContentsMargins( QMargins() );
m_layout->setSpacing( 0 );
m_layout->addWidget( m_label );
m_layout->addWidget( m_sizeGrip, 0, Qt::AlignBottom | Qt::AlignRight );

setWindowFlags( Qt::SubWindow );

基本上,它是一个水平布局,添加了标签和 handle ,然后安装在 QWidget 上。我的问题是我希望 handle 位于标签的右下角,而不是父小部件。我还想在保持启用状态的同时使其不可见。

或者也许我以错误的方式解决这个问题。我的最终目标是拥有一个文本显示小部件,用户可以在水平或垂直方向上调整其大小,但没有会遮挡文本的可见 handle 。我是否已经使用上面的代码走上了正确的轨道,还是有更好的方法来实现这一目标?

最佳答案

您可以创建自定义 QLabel为了那个原因。这个想法是跟踪鼠标移动事件(默认情况下仅在按下鼠标按钮时触发),并根据自上次事件以来鼠标移动了多少来调整大小。

这使您可以准确控制如何显示“夹具”(如果有的话)以及它应该具有什么形状。您可以将调整大小限制为垂直或水平(或不)。

这是一个演示如何做到这一点(双向调整大小)。警告:这可能会对您的布局造成严重破坏。

#include <QtGui>

class GripLabel: public QLabel
{
Q_OBJECT

public:
GripLabel(QString const& title, QWidget* parent = 0)
: QLabel(title, parent),
resizing(false),
gripSize(10, 10)
{
// Prevent the widget from disappearing altogether
// Bare minimum would be gripSize
setMinimumSize(100, 30);
}

QSize sizeHint() const
{
return minimumSize();
}

protected:
bool mouseInGrip(QPoint mousePos)
{
// "handle" is in the lower right hand corner
return ((mousePos.x() > (width() - gripSize.width()))
&& (mousePos.y() > (height() - gripSize.height())));
}

void mousePressEvent(QMouseEvent *e)
{
// Check if we hit the grip handle
if (mouseInGrip(e->pos())) {
oldPos = e->pos();
resizing = true;
} else {
resizing = false;
}
}

void mouseMoveEvent(QMouseEvent *e)
{
if (resizing) {
// adapt the widget size based on mouse movement
QPoint delta = e->pos() - oldPos;
oldPos = e->pos();
setMinimumSize(width()+delta.x(), height()+delta.y());
updateGeometry();
}
}

void paintEvent(QPaintEvent *e)
{
QLabel::paintEvent(e);
QPainter p(this);
p.setPen(Qt::red);
p.drawRect(width()-gripSize.width(), height()-gripSize.height(),
gripSize.width(), gripSize.height());
}

private:
bool resizing;
QSize gripSize;
QPoint oldPos;
};

sample 主要:
#include "griplabel.h"

int main(int argc, char **argv)
{
QApplication app(argc, argv);
QWidget *w = new QWidget;
QPushButton *b = new QPushButton("button");
GripLabel *l = new GripLabel("Hello");
QHBoxLayout *y = new QHBoxLayout;
y->addWidget(b);
y->addWidget(l);
y->setSizeConstraint(QLayout::SetFixedSize);
w->setLayout(y);
w->show();
return app.exec();
}

关于qt - 将 QSizeGrip 添加到 QLabel 的角落,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9964145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com