Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] QGraphicsWidget и connect


Автор: JanryMayers 20.1.2011, 09:53
Всем привет! 

Проблема такого характера. Хочу создать свою кнопку на основе QGraphicsWidet.
Создаю класс наследуясь от QGraphicsWidget. 
Не могу навесить на него connect.

Мой класс, *.h
Код

class SpritItem : public QGraphicsWidget{
    Q_OBJECT
public:
    explicit SpritItem(QGraphicsWidget*);
    QPixmap* pixmap;
    void setDimensions(int, int, int, int);
    ~SpritItem();
protected:
    void paint(QPainter *, const QStyleOptionGraphicsItem*,QWidget*);

    virtual void mousePressEvent(QMouseEvent *){
       qDebug()<<"=> SpritItem mousePressEvent...";
       emit clicked();
    }
    QRectF boundingRect() const{
        qDebug()<<"=> QRectF..."<<" x = "<<x<<",y = "<<y<<",dx = "<<dx<<",dy = "<<dy;
        return QRectF(x,y,dx,dy);
    }
signals:
    void clicked();
    void pressed();
public slots:
    
private:

    int x, y;
    int dx, dy;
};

место где я прописываю connect на первую кнопку new_game
Код

cGame::cGame():exit(new SpritItem(0)),
                            main_menu(new QGraphicsScene()),
                           .....,
                           .....,
                            new_game(new SpritItem(0)){
  ....
  ....
  
}
void cGame::main_menu_init(){

    main_menu->setBackgroundBrush(QPixmap(":/Data/images/main_bg.jpg"));

    new_game->pixmap = new QPixmap(":/Data/images/new_game.jpg");
    new_game->setDimensions(bPos_new_game_x, bPos_new_game_y, new_game_dx, new_game_dy);

    exit->pixmap = new QPixmap(":/Data/images/exit.jpg");
    exit->setDimensions(bPos_exit_x, bPos_exit_y, exit_dx, exit_dy);

    SpritItem::connect(new_game, SIGNAL(clicked()),this, SLOT(newGame())); // newGame() слот прописан в следующем куске кода

    main_menu->addItem(new_game);
    main_menu->addItem(exit);
    main_menu->setItemIndexMethod(QGraphicsScene::NoIndex);
}

класс cGame
Код

class cGame : public  QGraphicsView{
    Q_OBJECT
public:
        SpritItem* exit;
        QGraphicsScene* main_menu;  // главное меню
        ...
        SpritItem* new_game;        //кнопка новой игры
public:
    ...
        ...
protected slots:
    void newGame();


connect для второй кнопки exit
Код

int main(int argc, char *argv[])
{
    QApplication app(argc, argv); //Создаем объект приложение
    //проверка на наличие библиотеки OpenGL и пиксельный буфер расширения
    if (!QGLFormat::hasOpenGL() || !QGLPixelBuffer::hasOpenGLPbuffers()) {
        QMessageBox::information(0, "OpenGL pbuffers",
                                 "This system does not support OpenGL/pbuffers.");
        return -1;
    }
    cGame game; //объект Игра
    SpritItem::connect(game.exit, SIGNAL(clicked()), &app,SLOT(quit())); //Выход по кнопке "Exit"
    game.start(); // начало игры
    game.show(); // показать игру
    return app.exec();
}


при клике на эти спрайты ничего не происходит, только функция QRectF boundingRect() const вызываеца. 

Автор: panter 20.1.2011, 10:20
А в консоль что-нибудь выдает?

Автор: JanryMayers 20.1.2011, 10:24
нет вот только то что я прописал

 => construct SpritImage... 
 => construct SpritImage... 
 => construct cGame... 
 => main_menu_init... 
 => View... 
 =>SpritImage paint...
 =>SpritImage paint...

Автор: borisbn 20.1.2011, 10:37
mousePressEvent должен иметь такую сигнатуру
Цитата

void QGraphicsItem::mousePressEvent ( QGraphicsSceneMouseEvent * event ) 

Автор: JanryMayers 20.1.2011, 10:48
Спасибо, черт возьми, вроде ж и его пробывал)). Есть сигнал, кажется только от exit, причем он срабатывает не над кнопкой, а в левом верхнем углу. Как такое по лечить?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)