我试图重叠两个 QLabels。一个 qlabel 包含一个图像,而另一个在我告诉它时绘制一个矩形。两者都单独工作,但我需要将矩形 QLabel 重叠在图像 QLabel 的顶部。在 QMainWindow 中,我只有一个选项:setCentralWidget。我该怎么做?
问问题
3407 次
2 回答
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));
// ...
于 2012-05-23T17:32:05.583 回答
1
您可以将底部标签添加到布局中,但不能添加顶部(重叠)标签。从顶部的位置到底部的位置。对于底部标签,您需要使用从 QLabel 派生的类,您可以在其中覆盖resizeEvent(...)
、发出信号并调用继承的QLabel::resizeEvent(...)
. 将该信号连接到顶部标签中的插槽,也是 QLabel 派生类。插槽处理接收到的底部标签的几何形状以获得顶部标签的几何形状,并调用this->setGeometry(...)
. 下面是一个SSCCE。
#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"
于 2012-06-01T17:22:37.430 回答