我正在尝试制作一个由文本显示组成的小部件,可以通过用户抓住右下角来调整大小。到目前为止,我已经能够产生这个:
我在布局中应用了红色背景,以便更明显地发生了什么。我使用以下代码生成了这个:
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上。我的问题是我希望把握位于标签的右下角,而不是父小部件。我也希望在保持启用的同时使其不可见。
或许我可能会以错误的方式解决这个问题。我的最终目标是拥有一个文本显示小部件,可以由用户水平或垂直调整大小,但没有可见的抓握会遮挡文本。我已经使用上面的代码走上了正确的轨道,还是有更好的方法来实现这个目标?
答案 0 :(得分:1)
您可以为此创建自定义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;
};
示例主要:
#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();
}