Нужна помощь по обработке событий для сигнализации в QTcreator - PullRequest
0 голосов
/ 21 октября 2011

Итак, в основном я пытаюсь сделать следующее: я хочу создать на экране панель со стрелками.Когда пользователь нажимает клавишу «вверх» или «8», пользовательский интерфейс должен реагировать так, как будто я нажал кнопку «вверх».Я гуглил и искал повсюду, но поскольку я только начал использовать QTCreator (и C ++), я очень неопытен, и любая помощь будет признательна.

Пока у меня есть

class GamePadWidget : public QWidget
    {
    public:
        GamePadWidget(QWidget *parent = 0);

    protected:
        virtual void keyPressEvent(QKeyEvent *event);

    };
GamePadWidget::GamePadWidget(QWidget *parent)
    : QWidget(parent)
{

    int buttonWidth = 75;
    int buttonHeight = 75;

    QPushButton *down = new QPushButton(("Y-"), this);;
    down->setGeometry(100, 200, 100, 100);
    QIcon downicon;
    downicon.addFile(QString::fromUtf8("C:/arrows/Aiga_downarrow.png"), QSize(),QIcon::Normal, QIcon::Off);
    down->setIcon(downicon);
    down->setIconSize(QSize(buttonWidth,buttonHeight));
    down->setFocusPolicy(Qt::NoFocus);

    QPushButton *up = new QPushButton(("Y+"), this);;
    up->setGeometry(100, 50, 100, 100);
    QIcon upicon;
    upicon.addFile(QString::fromUtf8("C:/arrows/Aiga_uparrow.png"), QSize(),QIcon::Normal, QIcon::Off);
    up->setIcon(upicon);
    up->setIconSize(QSize(buttonWidth,buttonHeight));
    up->setFocusPolicy(Qt::NoFocus);

}
void GamePadWidget::keyPressEvent(QKeyEvent *event)
{
    if (event->key() == Qt::Key_8 || event->key() == Qt::Key_Up ) {
        printf("key event in board");

   }

   else if (event->key() == Qt::Key_9 || event->key() == Qt::Key_Down ) {
         qApp->quit();

    }
}

int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
     GamePadWidget widget;
     widget.show();
     return app.exec();
 }

с моим текущим кодом, если я нажимаю клавишу «вниз» или «2», приложение закрывается, как и ожидалось, но здесь есть часть, в которой я застрял.

Мне нужна та же функциональность, что и при нажатии клавиши «вниз» (или «вверх»).), кнопка должна кратковременно загореться, а затем подать сигнал тому, кто знает, где

Я понимаю, что это должно иметь какое-то отношение к connect (quit, SIGNAL (clicked ()), qApp, SLOT (quit ()));

но я не могу обернуться и найти его.

Спасибо за потраченное время.

1 Ответ

1 голос
/ 21 октября 2011

Вы можете вызывать слот для объекта, как если бы это был обычный метод (что касается C ++). Тем не менее, вам нужно сделать ваш pushButton участником, чтобы иметь доступ к нему вне конструктора.

Тогда да, просто подключите сигнал кнопки clicked () к слоту quit () приложения. Приведенный ниже код должен работать для вас (хотя и не тестировался):

GamePadWidget::GamePadWidget(QWidget *parent)
  : QWidget(parent)
{
  ...
  mDownButton = new QPushButton(("Y-"), this);;
  ...
  connect(mDownButton, SIGNAL(clicked()), qApp, SLOT(quit()));
}

void GamePadWidget::keyPressEvent(QKeyEvent *event)
{
  if (event->key() == Qt::Key_Down ) {
    qDebug() << "Down key pressed";
    mDownButton.click();
  }      
}
...