Qt:在 QGraphicsView/QGraphicsScene 上带有 child 的 QWidget 不工作
Qt: QWidget with a child on QGraphicsView/QGraphicsScene not working
我想创建一个视图,背景是基本图像,顶部是可拖动的小部件。
我的设置是这样的:
MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
ui->graphicsView->setScene(new QGraphicsScene(nullptr));
ui->graphicsView->scene()->addWidget(new BackgroundWidget(nullptr));
}
这很好用。也是:
MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
ui->graphicsView->setScene(new QGraphicsScene(nullptr));
BackgroundWidget * bgWidget = new BackgroundWidget(nullptr);
new ForegroundWidget(bgWidget);
ui->graphicsView->scene()->addWidget(bgWidget);
}
但是,我想动态添加前台小部件,但它不起作用。我注意到以下内容根本没有添加前景小部件:
MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
ui->graphicsView->setScene(new QGraphicsScene(nullptr));
BackgroundWidget * bgWidget = new BackgroundWidget(nullptr);
ui->graphicsView->scene()->addWidget(bgWidget);
new ForegroundWidget(bgWidget);
}
这会添加前景小部件,但不允许 semi-transparency 带有背景(项目需要):
MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
ui->graphicsView->setScene(new QGraphicsScene(nullptr));
BackgroundWidget * bgWidget = new BackgroundWidget(nullptr);
ui->graphicsView->scene()->addWidget(bgWidget);
ui->graphicsView->scene()->addWidget(new ForegroundWidget(nullptr));
}
关于为什么在添加背景小部件后添加 child 小部件不起作用的任何想法?如果是这样,有什么解决办法吗?
谢谢。
编辑:更正了代码块中的一些愚蠢的输入错误。
图片为问题的缩小版;小部件都设置为 semi-transparency(alpha 为 255 中的 100),但一个小部件似乎高于另一个。如果我以任何方式添加 'foreground' 小部件,我就会得到这个。以下是我期望得到的:
正如我所说,如果我在附加到场景之前添加它们,它工作正常,但我需要能够在 运行 时间添加到场景。
您的代码中存在多个内存泄漏问题。
根据 BackgroundWidget
和 ForegroundWidget
的实施,您要么想要
MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
ui->graphicsView->setScene(new QGraphicsScene(nullptr));
BackgroundWidget * bgWidget = new BackgroundWidget(nullptr);
ForegroundWidget * fgWidget = new ForegroundWidget(bgWidget);
ui->graphicsView->scene()->addWidget(fgWidget);
}
或
MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
ui->graphicsView->setScene(new QGraphicsScene(nullptr));
BackgroundWidget * bgWidget = new BackgroundWidget(nullptr);
ForegroundWidget * fgWidget = new ForegroundWidget(nullptr);
ui->graphicsView->scene()->addWidget(bgWidget);
ui->graphicsView->scene()->addWidget(fgWidget);
}
完整示例:
#include <QtGui>
class MainWindow : public QMainWindow
{
public:
MainWindow(QWidget *parent = 0) : QMainWindow(parent) {
QGraphicsView *graphicsView = new QGraphicsView;
setCentralWidget(graphicsView);
QGraphicsScene *scene = new QGraphicsScene;
graphicsView->setScene(scene);
QWidget *fgWidget = new QWidget;
fgWidget->setStyleSheet("background: rgba(255, 0, 0, 100)");
fgWidget->setMinimumSize(100, 100);
fgWidget->setMaximumSize(100, 100);
QWidget *bgWidget = new QWidget;
bgWidget->setStyleSheet("background: rgba(0, 0, 255, 100);");
bgWidget->setMinimumSize(100, 100);
bgWidget->setMaximumSize(100, 100);
bgWidget->move(50, 50);
scene->addWidget(fgWidget);
scene->addWidget(bgWidget);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow mainWindow;
mainWindow.show();
return app.exec();
}
如果您希望 fgWidget
成为 bgWidget
的父级:
QWidget *bgWidget = new QWidget(fgWidget);
....
scene->addWidget(fgWidget);
//scene->addWidget(bgWidget); // don't add it to the scene
我想创建一个视图,背景是基本图像,顶部是可拖动的小部件。
我的设置是这样的:
MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
ui->graphicsView->setScene(new QGraphicsScene(nullptr));
ui->graphicsView->scene()->addWidget(new BackgroundWidget(nullptr));
}
这很好用。也是:
MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
ui->graphicsView->setScene(new QGraphicsScene(nullptr));
BackgroundWidget * bgWidget = new BackgroundWidget(nullptr);
new ForegroundWidget(bgWidget);
ui->graphicsView->scene()->addWidget(bgWidget);
}
但是,我想动态添加前台小部件,但它不起作用。我注意到以下内容根本没有添加前景小部件:
MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
ui->graphicsView->setScene(new QGraphicsScene(nullptr));
BackgroundWidget * bgWidget = new BackgroundWidget(nullptr);
ui->graphicsView->scene()->addWidget(bgWidget);
new ForegroundWidget(bgWidget);
}
这会添加前景小部件,但不允许 semi-transparency 带有背景(项目需要):
MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
ui->graphicsView->setScene(new QGraphicsScene(nullptr));
BackgroundWidget * bgWidget = new BackgroundWidget(nullptr);
ui->graphicsView->scene()->addWidget(bgWidget);
ui->graphicsView->scene()->addWidget(new ForegroundWidget(nullptr));
}
关于为什么在添加背景小部件后添加 child 小部件不起作用的任何想法?如果是这样,有什么解决办法吗?
谢谢。
编辑:更正了代码块中的一些愚蠢的输入错误。
图片为问题的缩小版;小部件都设置为 semi-transparency(alpha 为 255 中的 100),但一个小部件似乎高于另一个。如果我以任何方式添加 'foreground' 小部件,我就会得到这个。以下是我期望得到的:
正如我所说,如果我在附加到场景之前添加它们,它工作正常,但我需要能够在 运行 时间添加到场景。
您的代码中存在多个内存泄漏问题。
根据 BackgroundWidget
和 ForegroundWidget
的实施,您要么想要
MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
ui->graphicsView->setScene(new QGraphicsScene(nullptr));
BackgroundWidget * bgWidget = new BackgroundWidget(nullptr);
ForegroundWidget * fgWidget = new ForegroundWidget(bgWidget);
ui->graphicsView->scene()->addWidget(fgWidget);
}
或
MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
ui->graphicsView->setScene(new QGraphicsScene(nullptr));
BackgroundWidget * bgWidget = new BackgroundWidget(nullptr);
ForegroundWidget * fgWidget = new ForegroundWidget(nullptr);
ui->graphicsView->scene()->addWidget(bgWidget);
ui->graphicsView->scene()->addWidget(fgWidget);
}
完整示例:
#include <QtGui>
class MainWindow : public QMainWindow
{
public:
MainWindow(QWidget *parent = 0) : QMainWindow(parent) {
QGraphicsView *graphicsView = new QGraphicsView;
setCentralWidget(graphicsView);
QGraphicsScene *scene = new QGraphicsScene;
graphicsView->setScene(scene);
QWidget *fgWidget = new QWidget;
fgWidget->setStyleSheet("background: rgba(255, 0, 0, 100)");
fgWidget->setMinimumSize(100, 100);
fgWidget->setMaximumSize(100, 100);
QWidget *bgWidget = new QWidget;
bgWidget->setStyleSheet("background: rgba(0, 0, 255, 100);");
bgWidget->setMinimumSize(100, 100);
bgWidget->setMaximumSize(100, 100);
bgWidget->move(50, 50);
scene->addWidget(fgWidget);
scene->addWidget(bgWidget);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow mainWindow;
mainWindow.show();
return app.exec();
}
如果您希望 fgWidget
成为 bgWidget
的父级:
QWidget *bgWidget = new QWidget(fgWidget);
....
scene->addWidget(fgWidget);
//scene->addWidget(bgWidget); // don't add it to the scene