2014-03-14 30 views
1

編輯QT的傳球對象,對不同級別

我最初創建的所有對象,當程序在我dialog.cpp啓動並存儲所有QPixmaps在數組,然後選擇從他們身上所有的隨機一個。那個隨機的QPixmap我想傳給我的maintargets類並在場景中繪製(這也是在dialog.cpp中創建的)。

// dialog.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方向移動。

+0

」不是個它只是main_targets [index]? – lpapp

+0

你是說main_targets [index]選擇隨機QPixmap嗎? – user3353931

+0

是的,你寫過'我想將隨機QPixmap傳遞給另一個類',所以我會假設你只是通過構造函數,getter或其他方法將它傳遞給另一個類。它有什麼問題? – lpapp

回答

0

簡單的通過引用是我失去了。這解釋了在maintargets類中獲取QPixmap變量所需的過程。

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

} 

//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); 
2

不幸的是你的問題非常廣泛,確切的解決方案取決於你的用例。我將針對您的問題提及幾種不同的解決方案,然後您可以查看一下,但請閱讀有關如何針對Stack Overflow提出問題的文檔,因爲此時您的問題質量很差。

1)如果您的操作應該構建其他類,那麼您可以將其作爲構造函數參數傳遞,如果它不違背您的設計以構建此類。

2)如果可以通過這種方式擴展類,並且可以訪問該方法中的對象實例,則可以使用void setPixmap(QPixmap); setter。

3)你可以使用一個代理類來處理所有這些,如果這是你在操作中獲得隨機索引的所有權限。

4)如果其他類在同一個源文件中需要,可以在同一個源文件中設置一個靜態變量。總的來說這不是一個好主意,但我也看到了這種情況。

5)您可以設置其他類方法正在使用的全局變量。再次,這是一個非常糟糕的做法。

6)您可以直接將此QPixmap作爲參數傳遞給其他類中的繪圖函數。

7)你可以將它傳遞給一個代理類對象,它將它傳遞給其他類的繪圖方法。

8)如果另一個類在不同的進程中,至少有另外的方法可以讓它通過。

正如我所說,這取決於你的情況,並且有很多方法可以做到這一點。話雖如此,我將在稍後刪除這個答案,因爲這個問題太廣泛了,但我想告訴你,你問的是多麼廣泛。

+0

希望這是更好的,我臭傳遞參數。 – user3353931

+0

是的,這樣比較好,但我覺得你現在從列表中得到了答案? – lpapp

+0

是的,但是我所做的並不正確,只要繪製_main_targets [index] _ – user3353931