Почему функция connect () не видит слот? - PullRequest
0 голосов
/ 31 октября 2019

У меня есть два класса, названных как Snake и MainClass. Мне нужно использовать нить. Для использования потока я должен использовать функцию Signal / Slot connect (). Но эта функция не подключалась к слоту. Я не понимаю почему. Вы можете найти небольшой фрагмент моего кода (связанную часть) ниже

MainClass.h
public:
   Snake *snake;
MainClass.cpp

QThread *thread1 = new QThread();

snake = new Snake();

snake->moveToThread(thread1);

connect(thread1, SIGNAL(started()), snake, SLOT(keyPressEvent(event)));

thread1->start();

Snake.h
class Snake : public QObject, public QGraphicsRectItem
{
    Q_OBJECT
public:
    Snake();

public slots:
    void keyPressEvent(QKeyEvent *event);
Snake.cpp
    void Snake::keyPressEvent(QKeyEvent *event)
{
    if(event->key()==Qt::Key_Left)
    {
       qDebug()<<"player1";
    }
}
main.cpp
MainClass *mainclass = new MainClass();
mainclass->show();
mainclass->game();

Игра работает до добавления connect (). Но когда я добавляю connect (), я вижу ошибку:

QObject::connect: No such slot Snake::keyPressEvent() in ..\YilanOyun\mainclass.cpp:62"

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Сигнал запуска QThread не имеет никаких аргументов, но вы подключаете его к KeyPressEvent, который принимает аргумент KeyEvent, поэтому он говорит, что не может найти слот, который не принимает аргумента. Слот и сигнатура должны совпадать.

0 голосов
/ 31 октября 2019

Я думаю, что знаю, что вы хотите сделать. Если вы хотите управлять своей змейкой в ​​отдельном потоке, то это можно сделать следующим образом:

Создайте keyPressEvent (событие QKeyEvent *), а не слот. Не в Snake, а в MainClass Наивно это события сигналы. Сигналы в Qt ничего не делают, только испускают сигнал. Я лично не рассматриваю их как реальные функции. Вам нужна отдельная функция, которая будет обрабатывать событие из сигнала.

Создайте другую функцию, которая будет слотом и будет обрабатывать ваше событие - например, move (QKeyEvent * event).

void Snake::move(QKeyEvent *event)
{
    if(event->key()==Qt::Key_Left)
    {
        qDebug()<<"player1";
    }
}

Соедините keyPressEvent с snakeMove

connect(MainClass, &MainClass::keyPressEvent, Snake, &Snake::move);

Не беспокойтесь о событии *, которое будет автоматически передано между двумя функциями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...