Создание слота в своем классе
В рамках задачи необходимо по нажатию кнопки (QPushButton) добавлять соответствующий символ в строку. Реализуется некоторое подобие авторизации пользователя. Для этого написан такой класс:
struct PStr:public QObject {
private:
std::string pass = "1234";
std::string input;
public slots:
void action(char c, QMainWindow * w)
{
input += c;
if (input == pass)
{
w->hide();
}
}
};
При вызове QObject::connect(button1, SIGNAL(clicked()), p, SLOT(action('1', w)));, где PStr * p, компилируется, но выдает ошибки в консоль при запуске:
QObject::connect: No such slot QObject::action('1', w)
Кто-то мельком и не подробно посоветовал указать конструктор, вынести определение метода и добавить Q_OBJECT, но тут я завис:
class PStr:public QObject {
Q_OBJECT
public slots:
void action(char c, QMainWindow * w);
public:
PStr() {
}
};
void PStr::action(char c, QMainWindow * w)
{
std::string pass = "1234";
std::string input;
input += c;
if (input == pass)
{
w->hide();
}
}
Ответы (1 шт):
макрос Q_OBJECT обязателен для рутин самого кьюта, чтобы при уничтожении вашего объекта он отключался от связанных с ним сигналов, освобождалась память и т.п..
Вы соединяете несоединяемое (https://doc.qt.io/qt-5/signalsandslots.html#signals-and-slots-with-default-arguments) ваш сигнал не имеет аргументов (
void), в то время как слот ожидает (char, QMainWindow*), чтобы такое соединить предложу использовать лямбду
QObject::connect(button1, &QPushButton::clicked, p, [=](){ p->action('1', w); });
Писал по памяти, мог ошибиться с синтаксисом