首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向QLabel的角落添加QSizeGrip

向QLabel的角落添加QSizeGrip
EN

Stack Overflow用户
提问于 2012-04-01 19:53:18
回答 1查看 3.4K关注 0票数 4

我正在尝试制作一个由文本显示组成的小部件,该文本显示可以通过用户抓住右下角来调整大小。到目前为止,我已经能够生成以下代码:

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

代码语言:javascript
复制
  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 );

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

或者我可能走错了路。我的最终目标是有一个文本显示小部件,它可以由用户水平或垂直调整大小,但没有可见的夹点会模糊文本。使用上面的代码,我是否已经在正确的轨道上,或者是否有更好的方法来实现这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-19 16:16:50

您可以为此创建一个自定义的QLabel。其想法是跟踪鼠标移动事件(默认情况下,仅在按下鼠标按键时触发),并根据自上次事件以来鼠标移动的量来调整大小。

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

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

代码语言:javascript
复制
#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;
};

示例main:

代码语言:javascript
复制
#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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9964145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档