2012-12-15 3 views
0

, 나는 위젯의 몇 선언과 같이 :클래스 외부에서 위젯에 액세스 하시겠습니까? Qt는 창조주에

헤더 파일 :

class MapViewer : public QGraphicsView 
{ 
    Q_OBJECT 

public: 
    explicit MapViewer(QGraphicsScene *scene, QWidget *parent = 0); 
    ~MapViewer(); 

public slots: 
    void mousePressEvent(QMouseEvent *event); 

}; 

// Declaration for the map editor window. 
class MapEditor : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MapEditor(QWidget *parent = 0); 
    ~MapEditor(); 

public: 
    QLayout *editorLayout; 
    QPushButton *btn; 
    QGraphicsScene *mapScene; 
    MapViewer *mapView; 

private: 
    Ui::MapEditor *ui; 
}; 

CPP 파일 :

MapEditor::MapEditor(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MapEditor) 
{ 

    ui->setupUi(this); 
    this->setWindowTitle("2DXY :: Map Editor"); 
    this->setGeometry(10,10,1170,750); 
    editorLayout = new QVBoxLayout; // Create a new layout 
    this->setLayout(editorLayout); // Set the widget's layout to our newly created layout. 

    mapScene = new QGraphicsScene(); // Create a new graphics scene to draw upon. 

    mapView = new MapViewer(mapScene,this); // Create a new graphics view to display our scene - set its parent to 'this' so that it doesn't open in a new window. 
    mapView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    mapView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    mapView->setGeometry(20,20,1178,546); // Width first, then height. 

AND :

void MapViewer::mousePressEvent(QMouseEvent *event) 
{ 
    // Show an empty message box, just to check that the event handler works! 
    QMessageBox *notification = new QMessageBox(); 
    notification->show(); 
    notification->exec(); 
    // Some how access the same QGraphicsScene and View (mapScene, mapView) as above, so 
    // I can update their contents on the open form/window. 

} 

그리고 당신이 볼 수 있듯이, 나는 Graphics Scene에 다시 액세스하여 그것을 업데이트하고, 다시 그리기를 원한다. t (또는 무엇이든). 그러나 위젯을 여러 가지 방법으로 선언하는 데 몇 시간의 시행 착오를 겪었지만 그래픽 장면에 전혀 액세스 할 수 없습니다.

새 메시지 상자를 열거 나 디버그 창으로 출력하도록 설정되어 있다면 작동하며 이미 정의한 위젯에 액세스 할 수 없기 때문에 수신기 자체가 작동한다는 것을 알고 있습니다.

이 문제에 대한 (상대적으로) 쉬운 해결책이 있으며, 나는 분명히 뭔가 빠져있는 것 같습니다.

+0

클래스의 멤버 변수를 만들고 getter 메소드를 제공하십시오 ... – cmannett85

+0

@ cmannett85 - 이것을 자세히 설명하거나 예제를 제공해 주시겠습니까? (저는 C++을 처음 접했습니다!) 감사합니다! – BnMcG

+0

브렛 쿤 (Bret Kuhns)은 그 일을 훌륭하게 해냈습니다. 그러나 이것이 C++을 배우는 방법이 아니라는 것을 강조해야합니다! Qt는 '일반적인'C++과 비교하여 일부 특이한/사용 불가능한 패러다임을 사용하므로 먼저 언어를 배우고 프레임 워크를 익히십시오. – cmannett85

답변

0
void MapViewer::mousePressEvent(QMouseEvent *event) 
{ 
    // Show an empty message box, just to check that the event handler works! 
    QMessageBox *notification = new QMessageBox(); 
    notification->show(); 
    notification->exec(); 

    // To add something whenever the user clicks, you don't need the view, 
    // just the scene. 
    scene()->addItem(new MyItem()); 
} 

MapViewerQGraphicsView에서 유래하고 뷰가이 속한 장면에 대해 알고 있어야합니다 기억하십시오.

+0

아, 알겠습니다! 그건 잘된거야! 양해 해 주셔서 감사합니다. – BnMcG

1

QGraphicsSceneMapRender 개체 생성자에 전달했습니다. 그 생성자 내의 장면으로 무엇을합니까? 이상적으로는 데이터 멤버로 MapRender으로 저장해야합니다. 예를 들어 :

class MapRender { 
public: 
    MapRender(QGraphicsScene* scene) 
     : scene_(scene) 
    { 
    } 

public slots: 
    void mousePressEvent(QMouseEvent *event); 

private: 
    QGraphicsScene* scene_; 
} 

지금 mousePressEvent의 구현에, 당신은 장면 멤버에 액세스 할 수 있습니다 : 당신이 이상적으로 CPP 파일에 생성자의 구현을 넣어해야 명심
void MapRender::mousePressEvent(QMouseEvent *event) { 
    int CursorX = event->globalX(); 
    int CursorY = event->globalY(); 

    QGraphicsRectItem *clickedBox = new QGraphicsRectItem(40,40,32,32); 
    clickedBox->setBrush(QBrush(Qt::blue)); 

    scene_->addItem(clickedBox); 
} 

, 그러나 나의 예는 간결함을위한 선언에서 그것을한다. 그래서 당신이 상속하는, 그것을 반환하는 scene() 방법이있다 -

+0

이제 QPlayEvent 핸들러에서 QGraphicsScene 벌금에 액세스 할 수 있습니다. 그러나 MapEditor :: addWidget() 메소드에서 어떻게 접근할까요? 예를 들어 그 위에 그릴 수 있습니까? 'scene _-> addLine (...); ' 감사합니다. Ben. – BnMcG

+0

글쎄, 당신은'MapEditor :: addWidget()'에 장면을 만들었고, 그래서 당신은 보통'scene-> addLine (...);'(당신의 예제에서'new') 이후에 접근 할 수 있습니다. 객체에 대한 포인터를 함수/생성자에 전달해도 현재 범위 내의 포인터는 무효화되지 않습니다. –