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

我将红色背景应用到布局中,以使正在发生的事情变得更加明显。我使用了以下代码来生成此代码:
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上。我的问题是,我希望夹点在标签的右下角,而不是父窗口小部件。我还想让它不可见,同时保持它的启用状态。
或者我可能走错了路。我的最终目标是有一个文本显示小部件,它可以由用户水平或垂直调整大小,但没有可见的夹点会模糊文本。使用上面的代码,我是否已经在正确的轨道上,或者是否有更好的方法来实现这一点?
发布于 2012-05-19 16:16:50
您可以为此创建一个自定义的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;
};示例main:
#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();
}https://stackoverflow.com/questions/9964145
复制相似问题