QGraphicsView 奇怪地渲染其子小部件的子小部件

Posted

技术标签:

【中文标题】QGraphicsView 奇怪地渲染其子小部件的子小部件【英文标题】:QGraphicsView rendering its sub widget's sub widget weirdly 【发布时间】:2015-08-26 01:59:34 【问题描述】:

我正在使用 C++ 和 Qt 开发音乐/MIDI 编辑器。 开发很顺利,直到我遇到 QGraphicsView 的子小部件的子小部件呈现奇怪的问题。 (哇,这令人困惑)

这是我用来将子小部件添加到 QGraphicsView 的代码

pianoPlain = new QawPianoPlain();
keyBoard = new QawPianoKeyBoard();
scene->addWidget(pianoPlain);
scene->addWidget(keyBoard);


keyBoard->setGeometry(0,0,100,540);
keyBoard->setKeyNum(36);

pianoPlain->setGeometry(100,0,500,540);
pianoPlain->setStriptNum(36);

代码是这样的。 钢琴卷 -> 键盘 -> 键 .............|-> 钢琴曲-> noteStript

其中pianoPlain 和keyBoard 是我从GraphicsView 继承的类,而key 和noteStript 都是从QWidget 继承的。

这是发生了什么的图片: https://drive.google.com/file/d/0BzYLJIsbhhuVZ0RMdzRqV01Cd2M/view?usp=sharing

这是一个普通键盘的图片,它直接放在 MainWindow(左)中,而一个搞砸的键盘放在 QGraphicsView(右) (我在这张图片中禁用了返回/while 键) https://drive.google.com/file/d/0BzYLJIsbhhuVSDFhSXRVM0dHWnM/view?usp=sharing

似乎每当将pianoPlain和keyBoard放在QGtraphicsView中时,它都会被搞砸。 有谁知道发生了什么?我该如何解决这个问题?

Qt:5.4.1 操作系统:KUubutu 15.04 AMD64 编译器:clang 3.6.0/ GCC 4.9.2

【问题讨论】:

澄清一下,您是否将QGraphicsView 小部件作为项目添加到QGraphicsScene!? 是的,我将小部件添加到场景中。 (既然有 addWidget,为什么不呢?)这就是事情出错的原因吗? 场景无法正确容纳渲染的项目,或者子小部件的代码可能存在错误。我建议创建一个示例子小部件并将其添加到场景中,以测试是您的场景布局有问题还是您的子小部件有问题。 经过一些测试。我不认为这是我的小部件的问题。如果将 QPushButton 放置在 QGraphicsView 的孙小部件中,即使 QPushButton 也无法正确呈现。 link to picture 可以看到,Button 2 没有渲染 【参考方案1】:

我建议pianoPlain 和keyBoard 应该使用继承QGraphicsItem 的类——例如QGraphicsPixmapItem 或QGraphicsProxyWidget。

然后您可以使用您的 scene->addWidget() 方法将这些添加到场景中。

场景本身应该是 QGraphicsView 的一部分。

例如:

QGraphicsView *view = new QGraphicsView();
QGraphicsScene* scene = new QGraphicsScene(view);

view->setScene(scene_);

// No need to parent these
pianoPlain = new QawPianoPlain();
keyBoard = new QawPianoKeyBoard();

// This will work if QawPianoPlain and QawPianoKeyBoard inherit QWidget
QGraphicsProxyWidget* pianoProxy = scene_->addWidget(pianoPlain);
QGraphicsProxyWidget* keyBoardProxy = scene_->addWidget(keyBoard );

使用代理小部件进行任何转换/动画。

【讨论】:

不,我没有做任何转换/动画。我只是将小部件添加到 QGraphicsView 中,其中 QGraphicsView 是另一个 QGraphicsView 场景的子小部件。在这种情况下。即使是普通的旧 QPushButton 也无法正确渲染。

以上是关于QGraphicsView 奇怪地渲染其子小部件的子小部件的主要内容,如果未能解决你的问题,请参考以下文章

如何在鼠标正下方的 QGraphicsView 上正确放置小部件?

如何制作小部件的屏幕截图并将其粘贴到 QGraphicsView 中?

使用 QGraphicsView 时小部件背景不透明,但使用 QGridLayout 时透明

在 QGraphicsView/QGraphicsScene 中移动 QGraphicsProxyWidget 中的嵌入式小部件

如何将 QGraphicsView 提升为 .ui 文件中的自定义小部件?

QGraphicsView 中的 MouseMoveEvent