2012-04-01 4 views
3

오른쪽 아래 모서리를 잡은 사용자가 크기를 조정할 수있는 텍스트 디스플레이로 구성된 위젯을 생성하려고합니다. 지금까지 나는이를 생성 할 수있었습니다 : I 적용한QLabel 모서리에 QSizeGrip 추가

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

설정 QLabel에 레이아웃과이 레이아웃에 QSizeGrip를 추가 –

답변

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