如何重叠两个QLabel?Qt4

如何重叠两个QLabel?Qt4,qt4,transparency,overlap,qlabel,Qt4,Transparency,Overlap,Qlabel,我正在尝试重叠两个QLabel。一个qlabel包含一个图像,而另一个则在我告诉它时绘制一个矩形。两者都可以单独工作,但我需要在图像QLabel的顶部重叠矩形QLabel。在QMainWindow中,我只有一个选项:设置CentralWidget。我该怎么做?如果需要两个重叠的标签,您不需要将它们添加到布局中,而是直接将它们放置在其父窗口中 大概是这样的: // ... parent = new QWidget(); label1 = new QLabel(parent); label2 = n

我正在尝试重叠两个QLabel。一个qlabel包含一个图像,而另一个则在我告诉它时绘制一个矩形。两者都可以单独工作,但我需要在图像QLabel的顶部重叠矩形QLabel。在QMainWindow中,我只有一个选项:设置CentralWidget。我该怎么做?

如果需要两个重叠的标签,您不需要将它们添加到布局中,而是直接将它们放置在其父窗口中

大概是这样的:

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

可以将底部标签添加到布局中,但不能将顶部(重叠)标签添加到布局中。从上一个位置到下一个位置。对于底部标签,需要使用从QLabel派生的类,在该类中重写
resizeEvent(…)
,发出信号,并调用继承的
QLabel::resizeEvent(…)
。将该信号连接到顶部标签中的插槽,也是QLabel派生的类。插槽操纵接收到的底部标签的几何图形以获取顶部标签的几何图形,并调用
this->setGeometry(…)
。下面是一个例子

//main.cpp
#包括
#包括
#包括
类TopLabel:公共QLabel
{
Q_对象
公众:
TopLabel(QWidget*parent=0):QLabel(parent){}
TopLabel(constqString&text,QWidget*parent=0):QLabel(text,parent){}
公众时段:
空隙底部几何结构(常数Q和r){
设置几何体(右左()+右宽()*0.25,右顶()+右高()*0.1,
r、 宽度()*0.5,r.高度()*0.5);
}
};
类底部标签:公共QLabel
{
Q_对象
公众:
BottomLabel(QWidget*parent=0):QLabel(parent){}
BottomLabel(常量QString&text,QWidget*parent=0):QLabel(文本,父项){}
信号:
void newGeometry(const QRect&r);
受保护的:
void resizeEvent(QResizeEvent*){emit newGeometry(geometry());}
void moveEvent(QMoveEvent*){emit newGeometry(geometry());}
};
类窗口:公共QWidget
{
公众:
窗口(){
QLayout*layout=新的QHBoxLayout();
QLabel*l=新的QLabel(“左”,this);
l->setFrameStyle(QFrame::Box | QFrame::凸起);
布局->添加小部件(l);
BottomLabel*bl=新的BottomLabel(“右”,此);
bl->setFrameStyle(QFrame::Box | QFrame::凸起);
TopLabel*tl=新的TopLabel(“TOP”,本);
tl->setFrameStyle(QFrame::StyledPanel);
连接(bl、信号(新几何体(QRect))、tl、插槽(底部几何体(QRect));
布局->添加小部件(bl);
设置布局(布局);
}
};
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
窗口w;
w、 show();
返回a.exec();
}
#包括“main.moc”

此外,您可能需要查看QWidget上的raise()和lower()方法,如下所示:
#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"