2012-04-01 128 views
3

我试图生成一个包含文本显示的小部件,该小部件可以通过用户抓取右下角来调整大小。到目前为止,我已经能够产生这样的:将QSizeGrip添加到QLabel的角落

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); 

基本上,这是一个横向布局与标签和抓地力添加到它,然后在一个QWidget安装。我的问题是,我希望把手位于标签的右下角,而不是父件。我也想让它在隐藏的同时保持启用状态。

或者我可能会以错误的方式去解决这个问题。我的最终目标是要有一个文本显示小部件,可以由用户水平或垂直调整大小,但没有明显的夹击会使文本模糊不清。我是否已经在上述代码的正确轨道上,或者有更好的方法来实现这一目标?

+0

组布局,并添加QSizeGrip到此布局 – 2012-04-01 14:40:00

回答

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; 
}; 

样品主:在QLabel

#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(); 
}