qt将对象传递到不同的类

qt passing object to different class

本文关键字:对象 qt      更新时间:2023-10-16

编辑

当程序在对话框.cpp中启动时,我最初创建了所有对象,并将所有QPixmap存储在一个数组中,然后从它们中随机选择一个。我想传递给我的maintargets类并在场景中绘制的随机QPixmap(它也是在对话框.cpp中创建的(

//对话.cpp

#include "dialog.h"
#include "scene.h"
#include "ui_dialog.h"
#include "instructions.h"
#include "settings.h"
#include "highscore.h"
#include "maintargets.h"
#include <stdlib.h>
 
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
 
    // Create and configure scene
     scene = new Scene;
     scene->setBackgroundBrush(Qt::black);
     scene->setItemIndexMethod(QGraphicsScene::NoIndex);
     ui->graphicsView->setScene(scene);
     scene->setSceneRect(-200, -150, 400, 300);
     ui->graphicsView->setMouseTracking(true);
 
     QPixmap tankbase1(":/images/tankbase.jpg");
     ui->tankbaseplay1->setPixmap(tankbase1);
 
     //Store targets in array and random generator
     index = 0;
     main_targets[0] = QPixmap(":images/darkbluelogo.jpg)");
     main_targets[1] = QPixmap(":images/graylogo.jpg");
     main_targets[2] = QPixmap(":images/lightbluelogo.jpg");
     main_targets[3] = QPixmap(":images/limE.jpg");
     main_targets[4] = QPixmap(":images/pink.jpg");
     main_targets[5] = QPixmap(":images/purple.jpg");
     main_targets[6] = QPixmap(":images/redlogo.jpg");
     main_targets[7] = QPixmap(":images/yellow.jpg");
     main_targets[8] = QPixmap(":images/brown.jpg");
 
     index = qrand((index % 9) + 1);
 
     //scene->addItem(main_targets[index]);
 
 
     //Timer for scene advancement
     QTimer *timer = new QTimer();
     QObject::connect(timer, SIGNAL(timeout()), scene, SLOT(advance()));
     timer->start(100);
 
}
 
Dialog::~Dialog()
{
    delete ui;
}

//主要目标.h

#ifndef MAINTARGETS_H
#define MAINTARGETS_H
#include "dialog.h"
#include <QGraphicsItem>
#include <QGraphicsScene>
#include <QPainter>
#include <QRect>
 
class MainTargets : public QGraphicsScene
{
public:
    MainTargets();
    QRectF boundingRect() const;
    QPainterPath shape() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
 
protected:
    void advance(int step);
 
private:  
    qreal dx, dy;
    qreal x, y;
    qreal w, h;
     
};
 
#endif // MAINTARGETS_H

//maintargets.cpp

#include "maintargets.h"
MainTargets::MainTargets()
{
    dx = -0.005;
    dy = 0.0;
    x = 1.5;
    y = 0.0;
    w = 100.0;
    h = 70.0;
}
QRectF MainTargets::boundingRect() const
{
    qreal shift = 1;
        return QRectF(-w/2 -shift, - h/2
                      - shift, w + shift, h + shift);
}
QPainterPath MainTargets::shape() const
{
    QPainterPath path;
    path.addRect(boundingRect());
    return path;
}
void MainTargets::paint(QPainter *painter,
                        const QStyleOptionGraphicsItem *option,
                        QWidget *widget)
{        
    painter->drawPixmap(-w/2, -h/2, main_targets[index]);
}
void MainTargets::advance(int step)
{
    if(step == 0) return;
    x = x + dx;
    y = y + dy;
    setPos(mapToParent(x, y));
}

绘制后,它在x方向上移动。

不幸的是,您的问题非常宽泛,具体的解决方案取决于您的用例。我将为您的问题提到一些不同的解决方案,然后您可以窥探一下,但请阅读有关如何在Stack Overflow上提问的文档,因为您的问题目前质量很低。

1( 如果你的操作应该构建另一个类,那么如果它不违反你构建这个类的设计,你可以将它作为构造函数参数传递。

2( 如果可以以这种方式扩展类,并且您可以访问该方法中对象的实例,则可以使用void setPixmap(QPixmap); setter。

3( 您可以使用一个代理类来处理所有这些,如果这是您在获取随机索引的操作中所能访问的全部权限的话。

4( 如果其他类在同一源文件中需要静态变量,则可以在同一个源文件中设置静态变量。总的来说,这不是一个好主意,但我也看到了这种情况的发生。

5( 您可以设置其他类方法正在使用的全局变量。同样,这是一种非常糟糕的做法。

6( 您可以将此QPixmap作为参数直接传递给其他类中的绘图函数。

7( 可以将其传递给代理类对象,代理类对象将其传递到其他类的绘图方法。

8( 如果另一个类处于不同的过程中,那么您至少可以获得其他许多方法来传递它。

正如我所说,这真的取决于你的场景,有很多方法可以做到这一点。也就是说,我稍后会删除这个答案,因为这个问题太宽泛了,但我想向你展示你的要求有多宽泛。

我失去了简单的引用传递。这解释了在maintargets类中获取QPixmap变量所需的过程。

//对话框.h

private:
    Ui::Dialog *ui;
    //add a pointer
    MainTargets* pmap;

//对话.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include "maintargets.h"
#include <stdlib.h>
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    // Create and configure scene
     scene = new Scene;
     scene->setBackgroundBrush(Qt::black);
     scene->setItemIndexMethod(QGraphicsScene::NoIndex);
     ui->graphicsView->setScene(scene);
     scene->setSceneRect(-200, -150, 400, 300);
     ui->graphicsView->setMouseTracking(true);
     QPixmap tankbase1(":/images/tankbase.jpg");
     ui->tankbaseplay1->setPixmap(tankbase1);
     //Store targets in array and random generator
     index = 1;
     main_targets[0] = QPixmap(":images/darkbluelogo.jpg)");
     main_targets[1] = QPixmap(":images/graylogo.jpg");
     main_targets[2] = QPixmap(":images/lightbluelogo.jpg");
     main_targets[3] = QPixmap(":images/lime.jpg");
     main_targets[4] = QPixmap(":images/pink.jpg");
     main_targets[5] = QPixmap(":images/purple.jpg");
     main_targets[6] = QPixmap(":images/redlogo.jpg");
     main_targets[7] = QPixmap(":images/yellow.jpg");
     main_targets[8] = QPixmap(":images/brown.jpg");

     //Timer for scene advancement
     QTimer *timer = new QTimer();
     QObject::connect(timer, SIGNAL(timeout()), scene, SLOT(advance()));
     timer->start(10);
}
Dialog::~Dialog()
{
    delete ui;
}

void Dialog::on_startButton_clicked()
{
    ui->settingsButton->hide();
    ui->titlescreen->hide();
    ui->highscoreButton->hide();
    ui->instructionButton->hide();
    ui->startButton->hide();
    QGraphicsTextItem *FirstP;
    QString P1 = "Player1";
    FirstP = scene->addText(P1);
    FirstP->setFont(QFont("Nimbus Mono L", 12,QFont::Bold));
    FirstP->setDefaultTextColor(Qt::white);
    FirstP->setPos(-300, -220);

    QGraphicsTextItem *SecondP;
    QString P2 = "Player2";
    SecondP = scene->addText(P2);
    SecondP->setFont(QFont("Nimbus Mono L", 12,QFont::Bold));
    SecondP->setDefaultTextColor(Qt::white);
    SecondP->setPos(230, -220);
    //Initializes function
    setPixmaps();
}
void Dialog::setPixmaps()
{
    index = (qrand() % (9));
    //Add a new MainTarget and set equal to new pointer created in header file
    pmap = new MainTargets(main_targets[index]);
    pmap->setPos(355,0);
    scene->addItem(pmap);
}

//主要目标.h

private:   
    //Add a new QPixmap to header
    QPixmap p;

//maintargets.cpp

构造函数中QPixmap变量中的引用,并设置为新创建的指针

#include "maintargets.h"
MainTargets::MainTargets(QPixmap& nomTargets)
{
    dx = -0.005;
    dy = 0.0;
    x = 0.0;
    y = 0.0;
    w = 100.0;
    h = 70.0;
    p = nomTargets;
}
QRectF MainTargets::boundingRect() const
{
    qreal shift = 1;
        return QRectF(-w/2 -shift, - h/2
                      - shift, w + shift, h + shift);
}
QPainterPath MainTargets::shape() const
{
    QPainterPath path;
    path.addRect(boundingRect());
    return path;
}
void MainTargets::paint(QPainter *painter,
                        const QStyleOptionGraphicsItem *option,
                        QWidget *widget)
{
    //Set that pointer variable as the source for the 
    //given drawPixmap memeber
    painter->drawPixmap(-w/2, -h/2, p);