1

2 つの QLabels を重ねようとしています。1 つの qlabel には画像が含まれており、もう 1 つの qlabel には指示すると長方形が描画されます。どちらも個別に機能しますが、画像 QLabel の上に四角形 QLabel を重ねる必要があります。QMainWindow には、setCentralWidget という 1 つのオプションしかありません。どうすればいいですか?

4

2 に答える 2

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 に答える