通常当我想影响ui上的对象时,我会在mainwindow.cpp中使用它:
ui->nameOfObject.doStuff();
但是现在我希望ui上的一个对象能够在我的班级对象的悬停事件发生时改变" Ball"触发了,但经过几个小时的挖掘文档后,我还没有找到从QGraphicsItem到ui的界面。 将数据从我的班级带到ui的最佳方法是什么?
所以我尝试按照我的代码现在的答案做的建议:
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
scene = new QGraphicsScene (this);
scene->setItemIndexMethod(QGraphicsScene::NoIndex);
ui->graphicsView->setScene (scene);
}
void MainWindow::on_createNewBallButton_clicked()
{
Ball *newBall = new Ball(newBallAngle, newBallRadius, newBallMass, newBallSpeed, newBallxCoordinate, newBallyCoordinate, ui);
scene->addItem(newBall);
}
Ball.h
public:
Ball(double phi, double r, double m, double v, double x, double y, Ui::MainWindow *uivalue);
Ui::MainWindow *ui;
protected:
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
Ball.cpp
Ball::Ball(double phi, double r, double m, double v, double x, double y, Ui::MainWindow *uivalue )
{
setAngle(phi);
speed = v;
mass = m;
hasCollided = 0;
radius = r;
setPos(x, y);
ui = uivalue;
}
void Ball::hoverEnterEvent(QGraphicsSceneHoverEvent * event)
{
double outSpeed = this->getV();
double outAngle = this->getPhi();
double outMass = this->getM();
double outRadius = this->getR();
double outxCoordinate = this->center().x();
double outyCoordinate = this->center().y();
ui->radiusOutput.setText(number(outRadius)); //Compiler: invalid use of incomplete type 'class Ui::MainWindow'
}
但是当我尝试构建这个时,我从编译器中得到了错误消息。我做错了什么?
答案 0 :(得分:0)
在大多数情况下,您应该使用信号/插槽在UI和其他类之间进行通信。但是在这里你处理的QGraphicsItem
不是QObject
子类,所以你不能使用signal / slot。当然,您可以使用QGraphicsObject
,但这会降低性能。因此解决问题的一种方法是将指针存储到UI对象并使用它进行操作。为此对象提供getter / setter。
void YourItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
if(pointer)
pointer->setText("Ball!");
}