当QWidget集成在QQuickPaintedItem中时,setVisible返回false

setVisible return false when QWidget is integrated in QQuickPaintedItem

本文关键字:setVisible 返回 false 中时 QQuickPaintedItem QWidget 集成      更新时间:2023-10-16

我遇到了集成在QQuickPaintedItem类中的Widget的一个问题。当我在QQuickPaintedItem中集成了Widget时,QWidget::isVisible将返回false。如果我尝试设置QWidget::setVisible(true),那么它将打开另一个窗口,这在我的场景中是不希望的。有没有办法让QWidget::isVisible返回true,这样当我说QWidget::show()时,我的子窗口小部件(在我的实际场景中,我们有5层父子层次结构)也会正常工作?

我创建了类似的场景,如下所示。

头文件:

class MyItem: public QQuickPaintedItem{
    Q_OBJECT
public:
    explicit MyItem(QQuickItem *parent = 0);
    void paint(QPainter *painter);
    ~MyItem();
    Q_INVOKABLE void initButton();
protected:
    virtual void mousePressEvent( QMouseEvent* event );
private:
    QPushButton*   bp;
};

源文件:

MyItem::MyItem(QQuickItem *parent)
    : QQuickPaintedItem(parent)
{
    bp = new QPushButton("Hello");
}
MyItem::~MyItem()
{
    delete bp;
}
void MyItem::paint(QPainter *painter){
    bp->render(painter, QPoint(), QRegion(), QPushButton::DrawWindowBackground | QPushButton::DrawChildren);
}
void MyItem::mousePressEvent( QMouseEvent* event )
{
    qDebug() << Q_FUNC_INFO << bp->isVisible();
}

感谢您提前提供帮助。。。!!!

我不知道你为什么要这么做。

Qt不支持将QWidget嵌入Qt5中的Qt Quick Item(Qt Quick 2)。

在你的代码中,QWidget是一个单独的窗口,而你的Qt Quick项目在它自己的窗口中。

如果你想要你的Qt-Quick项目行为像一个按钮,你应该使用Qt-Quick的按钮控件或自己写一个。

如果您真的想将QWidget嵌入Qt Quick的控制树中,可以使用Qt Quick 1(Qt4.7/8)。查看QGraphicsProxyWidget的文档。