[SOLVED] QGraphicsView promotion
-
Hi, welcome to devnet.
Subclassing is not enough for a custom widget to show up in the editor. It's ok to promote to it but if you want the editor to show your custom widget you need to create a "designer plugin":http://qt-project.org/doc/qt-5/designer-creating-custom-widgets.html for that widget.
-
Sorry, I said imprecisely. I launch the application I'm working on, it's window contains some buttons, menu toolbar & my object which inherited from QGraphicsView. All elements except my class' object are visible on window and work. More shortly) My object is visible in editor but not visible when I launch program. I know about designer plugin, but it is another problem.
-
It's hard to say without more details. What's the layout situation? Does your class set any sizes, size policies, visibility flags etc. If it's possible provide some code samples.
-
I don't set any object properties. I tried to set isEnabled(true), it's not helped. Also there is no any layouts which I set manually.
My class is quiet simple. Here is header:
@#ifndef HEXVIEW_H
#define HEXVIEW_H#include <QGraphicsView>
#include <QObject>class HexView : public QGraphicsView
{
Q_OBJECT
public:
HexView(QObject *parent = 0);
//~HexView(){};protected:
void wheelEvent(QWheelEvent *event);private slots:
void setupMatrix();private:
int viewZoom;
};#endif // HEXVIEW_H
@And source:
@#include "hexview.h"
#include <QDebug>
#include <QWheelEvent>
#include <qmath.h>#define D qDebug()
HexView::HexView(QObject *parent) :
QGraphicsView(),
viewZoom(0)
{
}void HexView::wheelEvent(QWheelEvent *event)
{
viewZoom += (event->delta() / 40);
setupMatrix();
}void HexView::setupMatrix()
{
qreal scale = qPow( qreal(2), viewZoom / qreal(50) );
QMatrix matrix;
matrix.scale(scale, scale);
setMatrix(matrix);
update();
}
@In mainwindow.cpp:
@scene = new HexScene ();
ui->graphicsView->setScene(scene);@Editor:
!http://i58.tinypic.com/15cbl6p.png(Designer form)!Application:
!http://i61.tinypic.com/2pquf79.png(application)! -
One error is that you're not passing the parent parameter to the QGraphicsView constructor.
Apart from that you're setting some custom scene. Does it have a transparent background brush? Is it the same if you don't set scene at all?EDIT: And are you sure the widget is not there? Maybe just the color is different. Try to draw something.
-
If I understand it correctly parent parameter is set to pass automatically, here is a part of ui_mainwindow.h related with graphicsView object:
@graphicsView = new HexView(centralWidget);
graphicsView->setObjectName(QString::fromUtf8("graphicsView"));
graphicsView->setGeometry(QRect(110, 110, 581, 361));@Yes, I'm creating custom scene too. These code:
@qDebug() << endl << scene->backgroundBrush();@says: "QBrush(QColor(ARGB 1, 0, 0, 0) , NoBrush ) "
I also tried to set my brush with scene->setBackgroundBrush() - no changes.
Also, nothing is changed when I had set no scene for graphicsView.There is a screenshot with standard QGraphicsView, I didn't change any properties.
!http://i58.tinypic.com/33e1u6e.png(s)!Anyway, thanks for your help Chris.
-
bq. If I understand it correctly parent parameter is set to pass automatically
There's no such thing in c++. How is compiler suppose to know something like that?
Here:
@HexView::HexView(QObject *parent) : QGraphicsView(), viewZoom(0) { @
you are explicitly calling a parameterless version of the QGraphicsView base constructor which gets nullptr as a parent. You should pass here what you get in the parameter of your constructor:
@HexView::HexView(QObject *parent) : QGraphicsView(parent), viewZoom(0) { @
This is always true when inheriting QObjects. What you've got is a real error, but I doubt it's the cause of this particular problem.Well there are no miracles so there must be some cause behind this. I just tested it and it works as expected. Can you maybe pack the whole project (or just stripped to the reproducible minimum) and share it somewhere?
-
It seems you are right. However an error occurs with your proposition:
"error: call of overloaded 'QGraphicsView(QObject*&)' is ambiguous",
"no known conversion for argument 1 from 'QObject*' to 'const QGraphicsView&'"
That error points on my poor c++ understanding.
I shall continue this number tomorrow. Thanks again, Chris. -
Ah yes, I missed it previously. The QGraphicsView is actually a QWidget, so it's a more derived class of QObject. Therefore your constructor signature is wrong.
It should be
@
//.h file
HexView(QWidget *parent = 0);//.cpp file
HexView::HexView(QWidget *parent) : QGraphicsView(parent), viewZoom(0) {
@With this error I can actually reproduce your problem so fixing the constructor signature should fix the issue.