首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何重叠两个QLabels?Qt4

如何重叠两个QLabels?Qt4
EN

Stack Overflow用户
提问于 2012-05-24 01:00:11
回答 2查看 3.3K关注 0票数 1

我在试着重叠两个QLabels。一个qlabel包含一个图像,而另一个在我告诉它的时候绘制一个矩形。两者单独工作,但我需要在图像QLabel的顶部重叠矩形QLabel。在QMainWindow中,我只有一个选择: to setCentralWidget。我该怎么做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-24 01:32:06

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

如下所示:

代码语言:javascript
运行
复制
// ...
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));
// ...
票数 2
EN

Stack Overflow用户

发布于 2012-06-02 01:22:37

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

代码语言:javascript
运行
复制
#overlap.pro
QT       += core gui
TARGET = overlap
TEMPLATE = app
SOURCES += main.cpp
代码语言:javascript
运行
复制
//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"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10724581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档