【问题标题】:qt passing object to different classqt将对象传递给不同的类
【发布时间】:2014-03-14 02:38:37
【问题描述】:

编辑

当程序在我的 dialog.cpp 中启动时,我最初会创建所有对象,并将所有 QPixmap 存储在一个数组中,然后从它们中随机选择一个。我想传递给我的 maintargets 类并在场景中绘制的随机 QPixmap(它也在 dialog.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;
}

//maintargets.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 方向移动。

【问题讨论】:

  • 不就是 main_targets[index] 吗?
  • 你是说 main_targets[index] 用于选择随机 QPixmap 吗?
  • 是的,你写了I want to pass the random QPixmap to another class,所以我假设你只是通过构造函数、getter 或其他方式将它传递给另一个类。它有什么问题?
  • 你能展示一些传递参数的代码吗?就像​​我正在尝试做的那样?
  • 不提供更多信息是不可能的。例如,您是否有权访问 dialog.cpp 中的 maintargets 对象,您可以在其中获取随机图像?

标签: c++ qt qtgui qgraphicsscene qpixmap


【解决方案1】:

不幸的是,您的问题非常广泛,确切的解决方案取决于您的用例。我会针对你的问题提几个不同的解决方案,然后你可以看看,但请阅读有关如何在 Stack Overflow 上提问的文档,因为你的问题目前质量很低。

1) 如果您的操作应该构建另一个类,如果它不违反您构建此类的设计,则可以将其作为构造函数参数传递。

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

3) 您可以使用代理类来处理所有这些问题,如果这是您在获取随机索引的操作中可以访问的全部内容。

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

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

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

7) 您可以将此传递给代理类对象,该代理类对象会将其传递给其他类的绘图方法。

8) 如果另一个类在不同的进程中,你至少还有很多方法可以通过它。

正如我所说,这实际上取决于您的场景,并且有很多方法可以做到这一点。话虽如此,我稍后会删除这个答案,因为这个问题太宽泛了,但我希望向您展示您所问的内容有多么广泛。

【讨论】:

  • 希望这样会更好,而且我在传递参数时很讨厌。
  • 是的,这更好,但我感觉您现在的答案已经不在列表中了?
  • 是的,但就绘制 main_targets[index] 而言,我所做的并不正确
  • 抱歉,这就是传递变量的全部意义......传递一个变量以实际使用它。
  • 基本上只是将 QPixmap 传递给 maintargets 类
【解决方案2】:

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

//dialog.h

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

//dialog.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);

}

//maintargets.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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    相关资源
    最近更新 更多