2012-05-23 91 views
1

我想重疊兩個QLabels。一個qlabel包含一個圖像,而另一個qlabel當我告訴它時繪製一個矩形。兩者都單獨工作,但我需要重疊在圖像QLabel頂部的矩形QLabel。在QMainWindow中,我只有一個選項:setCentralWidget。我將如何做到這一點?如何重疊兩個QLabels? 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"