0

Qt Creatorには、次のように宣言されたウィジェットがいくつかあります。

ヘッダーファイル:

    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.

と:

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.

}

ご覧のとおり、グラフィックシーンに再度アクセスして更新してから、再描画(またはその他)したいと思います。しかし、ウィジェットをさまざまな方法で宣言するための数時間の試行錯誤にもかかわらず、グラフィックシーンにまったくアクセスできません。

リスナー自体が機能することはわかっています。新しいメッセージボックスを開くように設定されているか、デバッグウィンドウに出力するように設定されている場合は機能しますが、定義済みのウィジェットにアクセスできないだけです。

この問題には(比較的)簡単な解決策があり、明らかな何かが欠けているだけだと感じています。

4

2 に答える 2

1

オブジェクトのコンストラクターQGraphicsSceneにを渡しました。MapRenderコンストラクター内のシーンをどうしますか?理想的には、のデータメンバーとして保存する必要がありますMapRender。例えば:

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

public slots:
    void mousePressEvent(QMouseEvent *event);

private:
    QGraphicsScene* scene_;
}

これで、の実装でmousePressEvent、シーンメンバーにアクセスできます。

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);
}

理想的には、コンストラクターの実装をcppファイルに配置する必要があることに注意してください。ただし、私の例では、簡潔にするためにそれを宣言しています。

于 2012-12-15T18:22:55.017 に答える
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() );
}

MapViewer派生元でQGraphicsViewあり、ビューはそれが属するシーンを認識している必要があることを忘れないscene()でください。したがって、継承したシーンを返すメソッドがあります。

于 2012-12-16T11:28:18.293 に答える