5

QDockWidgetを継承するクラスがQtにあります。そして、そのクラスには別のウィジェットが含まれています。含まれているウィジェットの上に何かを描画するQDockWidget継承クラスで関数を定義する可能性はありますか?含まれているウィジェットから独立しているが、継承されたクラスにリンクされている絵画のように。

ありがとうございました

4

3 に答える 3

10

確かにそれは可能です。実際、これを行うのはかなり簡単です。内の他のすべての上に配置される子ウィジェットを配置する必要がありますQDockWidget。そのためには、ドックウィジェットに追加する最後の子ウィジェットである必要があります。そのウィジェットはその背景を描画してはならず、そうすればドックウィジェットの子を描画できます。ウィジェットのサイズは、親ウィジェットのサイズを追跡する必要があります。

以下は自己完結型の例です。

例のスクリーンショット

// https://github.com/KubaO/stackoverflown/tree/master/questions/overlay-line-11034838
#include <QtGui>
#if QT_VERSION > QT_VERSION_CHECK(5,0,0)
#include <QtWidgets>
#endif

class Line : public QWidget {
protected:
   void paintEvent(QPaintEvent *) override {
        QPainter p(this);
        p.setRenderHint(QPainter::Antialiasing);
        p.drawLine(rect().topLeft(), rect().bottomRight());
    }
public:
    explicit Line(QWidget *parent = nullptr) : QWidget(parent) {
       setAttribute(Qt::WA_TransparentForMouseEvents);
    }
};

class Window : public QWidget {
    QHBoxLayout layout{this};
    QPushButton left{"Left"};
    QLabel right{"Right"};
    Line line{this};
protected:
    void resizeEvent(QResizeEvent *) override {
        line.resize(size());
    }
public:
    explicit Window(QWidget *parent = nullptr) : QWidget(parent) {
        layout.addWidget(&left);
        right.setFrameStyle(QFrame::Box | QFrame::Raised);
        layout.addWidget(&right);
        line.raise();
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    Window w;
    w.show();
    return app.exec();
}
于 2012-06-15T03:32:51.240 に答える
0

AFAIK:いいえ。

ウィジェットは詳細な順序で描画されるため、QDockWidget派生クラスがペイントするものはすべて、更新時に含まれているウィジェットによって描画されます(ペイントの更新は子ウィジェットに伝播されるため、直後は間違いありません)。

于 2012-06-14T14:11:03.580 に答える
0

受け入れられた答えのPythonバージョン:

# Created by BaiJiFeiLong@gmail.com at 2022/1/15 10:22

from PySide2 import QtWidgets, QtGui, QtCore

app = QtWidgets.QApplication()
widget = QtWidgets.QWidget()

line = QtWidgets.QFrame(widget)
line.paintEvent = lambda _: QtGui.QPainter(line).drawLine(line.rect().topLeft(), line.rect().bottomRight())
line.setAttribute(QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents)

widget.setLayout(QtWidgets.QGridLayout(widget))
widget.layout().addWidget(QtWidgets.QPushButton("CLICK ME", widget))
widget.resizeEvent = lambda event: line.resize(event.size())

line.raise_()
widget.show()
app.exec_()

これは機能しないことに注意QSplitterしてください。この状態ではQMainWindow、親ウィジェットとして使用する必要があります。

于 2022-01-15T02:54:07.713 に答える