2012-05-23 4 views
1

두 개의 QLabel을 겹치려고합니다. 하나의 qlabel에는 이미지가 포함되어 있으며, 다른 qlabel에는 내가 말할 때 사각형이 그려집니다. 둘 다 개별적으로 작동하지만 이미지 QLabel 위에 사각형 QLabel을 겹쳐 써야합니다. QMainWindow에는 setCentralWidget에 대한 옵션 하나만 있습니다. 어떻게하면 좋을까요?두 개의 Q 라벨을 겹치는 방법은 무엇입니까? Qt4

답변

2

두 개의 겹치는 레이블을 원하면 레이아웃에 추가하지 않고 상위 창에 직접 배치하십시오. 이 같은

뭔가 :

// ... 
parent = new QWidget(); 
label1 = new QLabel(parent); 
label2 = new QLabel(parent); 
label1->setGeometry(QRect(100,100,80,20)); 
label2->setGeometry(QRect(100,100,80,20)); 
// ... 
+1

또한, 당신이는 QWidget의 인상()와() 낮은 방법을 조사 할 수 있습니다 : http://qt-project.org/ 포럼/viewthread/16285 – mydoghasworms

1

당신은 레이아웃에 하단 레이블을 추가 할 수 있지만 상단 하나를 (중복) 할 수 있습니다. 상단의 위치를 ​​하단의 위치로 종속시킵니다. 맨 아래 레이블의 경우 QLabel에서 파생 된 클래스를 사용해야합니다. 여기서 resizeEvent(...)을 재정의하고 신호를 내 보낸 다음 상속 된 QLabel::resizeEvent(...)을 호출해야합니다. 해당 신호를 QLabel 파생 클래스 인 최상위 레이블의 슬롯에 연결하십시오. 슬롯은 맨 아래 라벨의 수신 된 형상을 조작하여 상단 라벨의 형상을 얻고 this->setGeometry(...)을 호출합니다. 아래는 SSCCE입니다. 다음과 같이

Output from the example code

#overlap.pro 
QT  += core gui 
TARGET = overlap 
TEMPLATE = app 
SOURCES += main.cpp 
//main.cpp 
#include <QtGui/QLabel> 
#include <QHBoxLayout> 
#include <QtGui/QApplication> 

class TopLabel : public QLabel 
{ 
    Q_OBJECT 
public: 
    TopLabel(QWidget * parent = 0) : QLabel(parent) {} 
    TopLabel(const QString & text, QWidget * parent = 0) : QLabel(text, parent) {} 
public slots: 
    void bottomGeometry(const QRect & r) { 
     setGeometry(r.left() + r.width()*0.25, r.top() + r.height()*0.1, 
        r.width()*0.5, r.height()*0.5); 
    } 
}; 

class BottomLabel : public QLabel 
{ 
    Q_OBJECT 
public: 
    BottomLabel(QWidget * parent = 0) : QLabel(parent) {} 
    BottomLabel(const QString & text, QWidget * parent = 0) : QLabel(text, parent) {} 
signals: 
    void newGeometry(const QRect & r); 
protected: 
    void resizeEvent(QResizeEvent *) { emit newGeometry(geometry()); } 
    void moveEvent(QMoveEvent *) { emit newGeometry(geometry()); } 
}; 

class Window : public QWidget 
{ 
public: 
    Window() { 
     QLayout * layout = new QHBoxLayout(); 
     QLabel * l = new QLabel("Left", this); 
     l->setFrameStyle(QFrame::Box | QFrame::Raised); 
     layout->addWidget(l); 
     BottomLabel * bl = new BottomLabel("Right", this); 
     bl->setFrameStyle(QFrame::Box | QFrame::Raised); 
     TopLabel * tl = new TopLabel("TOP", this); 
     tl->setFrameStyle(QFrame::StyledPanel); 
     connect(bl, SIGNAL(newGeometry(QRect)), tl, SLOT(bottomGeometry(QRect))); 
     layout->addWidget(bl); 
     setLayout(layout); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Window w; 
    w.show(); 
    return a.exec(); 
} 

#include "main.moc" 
관련 문제