Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
1 / 1 / 1
Регистрация: 15.03.2016
Сообщений: 47
1

Не получается подцепить слот

31.03.2017, 10:42. Показов 1084. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Создаю класс Wizard, наследующий класс QWizard, который является наследником QObject:
Заголовочный файл
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef WIZARD_H
#define WIZARD_H
 
#include <QtWidgets>
class Wizard : public QWizard {
    Q_OBJECT
private:
    int* color;
    int* instrument;
 
    QWizardPage* createPage(QWidget* pwgt, QString strTitle);
 
 
public:
    Wizard(int* instrument, int* color,QWidget* pwgt = 0);
 
public slots:
    void change_value_color(int value);
    void change_value_instrument(int value);
};
 
 
#endif // WIZARD_H

.cpp файл
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include "wizard.h"
 
Wizard::Wizard(int* instrument, int* color,QWidget* pwgt) : QWizard(pwgt)
{
        this->instrument = instrument;
        this->color = color;
 
        QWizardPage* ppage1 = new QWizardPage;
        ppage1->setTitle("Выберите устройство ввода");
        QRadioButton* guitar = new QRadioButton();
        guitar->setText("Электро-гитара");
        guitar->setChecked(true);
        QRadioButton* bas = new QRadioButton();
        bas->setText("Бас-гитара");
        QRadioButton* drums = new QRadioButton();
        drums->setText("Электронная ударная установка");
        QRadioButton* synth = new QRadioButton();
        synth->setText("Синтезатор/Электронное пианино");
        QVBoxLayout* lay1 = new QVBoxLayout();
        lay1->addWidget(guitar);
        lay1->addWidget(bas);
        lay1->addWidget(drums);
        lay1->addWidget(synth);
        ppage1->setLayout(lay1);
 
 
        QWizardPage* ppage2 = new QWizardPage;
        ppage2->setTitle("Выберите цветовую схему");
        QRadioButton* nymf = new QRadioButton();
        nymf->setText("Цвет бедра испуганной нимфы");
        nymf->setChecked(true);
        QRadioButton* bird = new QRadioButton();
        bird->setText("Окраски птицы чирок");
        QRadioButton* frog = new QRadioButton();
        frog->setText("Лягушка в обмороке");
        QRadioButton* egg = new QRadioButton();
        egg->setText("Яиц странствующего дрозда");
        QVBoxLayout* lay2 = new QVBoxLayout();
        lay2->addWidget(nymf);
        lay2->addWidget(bird);
        lay2->addWidget(frog);
        lay2->addWidget(egg);
        ppage2->setLayout(lay2);
 
 
 
        addPage(ppage1);
        addPage(ppage2);
 
        QObject::connect(guitar,SIGNAL(clicked(bool)),this,SLOT(change_value_instrument(1)),Qt::AutoConnection);
        QObject::connect(bas,SIGNAL(clicked(bool)),this,SLOT(change_value_instrument(2)),Qt::AutoConnection);
        QObject::connect(drums,SIGNAL(clicked(bool)),this,SLOT(change_value_instrument(3)),Qt::AutoConnection);
        QObject::connect(synth,SIGNAL(clicked(bool)),this,SLOT(change_value_instrument(4)),Qt::AutoConnection);
 
 
        QObject::connect(nymf,SIGNAL(clicked(bool)),this,SLOT(change_value_color(1)),Qt::AutoConnection);
        QObject::connect(bird,SIGNAL(clicked(bool)),this,SLOT(change_value_color(2)),Qt::AutoConnection);
        QObject::connect(frog,SIGNAL(clicked(bool)),this,SLOT(change_value_color(3)),Qt::AutoConnection);
        QObject::connect(egg,SIGNAL(clicked(bool)),this,SLOT(change_value_color(4)),Qt::AutoConnection);
    }
 
QWizardPage* Wizard:: createPage(QWidget* pwgt, QString strTitle)
{
    QWizardPage* ppage = new QWizardPage;
    ppage->setTitle(strTitle);
 
    QVBoxLayout* playout = new QVBoxLayout;
    playout->addWidget(pwgt);
    ppage->setLayout(playout);
 
    return ppage;
}
 
void Wizard:: change_value_color(int value)
{
    *color = value;
}
void Wizard:: change_value_instrument(int value)
{
    *instrument = value;
}


Объект подобного диалогового окна создается и вызывается внутри MainWindow, хотя вряд ли это существенно. В результате, программа компилируется и запускается, но с вот такими замечаниями:
QObject::connect: No such slot Wizard::change_value_instrument(1) in ..\lab_3\wizard.cpp:51
QObject::connect: No such slot Wizard::change_value_instrument(2) in ..\lab_3\wizard.cpp:52
QObject::connect: No such slot Wizard::change_value_instrument(3) in ..\lab_3\wizard.cpp:53
QObject::connect: No such slot Wizard::change_value_instrument(4) in ..\lab_3\wizard.cpp:54
QObject::connect: No such slot Wizard::change_value_color(1) in ..\lab_3\wizard.cpp:57
QObject::connect: No such slot Wizard::change_value_color(2) in ..\lab_3\wizard.cpp:58
QObject::connect: No such slot Wizard::change_value_color(3) in ..\lab_3\wizard.cpp:59
QObject::connect: No such slot Wizard::change_value_color(4) in ..\lab_3\wizard.cpp:60

Как видно из исходников, макрос Q_OBJECT в начале объявления класса прописать я не забыл, сам класс, пусть и не прямо, но наследуется от QObject. Не подскажите, чем вылечить эту беду?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.03.2017, 10:42
Ответы с готовыми решениями:

Виртуальный слот vs слот, вызывающий виртуальную функцию
Всем известно (ИМХО :) ), что виртуальные слоты работают примерно в 10 раз медленнее. Для задачи, в...

Не получается подцепить Dll для работы с LPT портом
Мне необходимо из Access управлять устройством через LPT порт. Нашел (очень ее хвалят) библиотеку...

Подцепить dll c++
Есть dll и её .h файл. #ifndef __ACI_PROG_H__ #define __ACI_PROG_H__ typedef struct...

Подцепить скрипт к базе
есть скрипт счётчика кликов по кнопке, но само значение хранится в скрипте и после обновления...

6
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 834
31.03.2017, 10:59 2
Лучший ответ Сообщение было отмечено HepoH как решение

Решение

QObject:: перед connect можно опустить.
Qt::AutoConnection тоже можно опустить. Последний параметр имеет значение по-умолчанию. И оно как раз Qt::AutoConnection.
Ты не можешь указывать значения переменных в сигналах и слота. Только типы.
Например
C++ (Qt)
1
connect(drums,SIGNAL(clicked(bool)),this,SLOT(change_value_instrument(bool));
А само значение уже анализировать в слоте. При этом ты можешь не принимать параметры сигнала в слоте при их соединении.
C++ (Qt)
1
connect(drums,SIGNAL(clicked(bool)),this,SLOT(change_value_instrument(/*ничего нет*/));
Аналогично ты можешь в слоте принимать только часть переданных сигналом параметров.
Ну и наконец - нельзя соединять сигнал со слотом, который принимает тип, отличный от типа параметра сигнала
C++ (Qt)
1
connect(drums,SIGNAL(clicked(bool)),this,SLOT(change_value_instrument(int /*тут ошибка*/));
1
1 / 1 / 1
Регистрация: 15.03.2016
Сообщений: 47
31.03.2017, 11:11  [ТС] 3
Горбаг, когда я опускаю последний параметр при соединении, синтаксис подсвечивается ошибкой, якобы я что-то забыл перед скобкой, поэтому я и написал туда значение по-умолчанию.
Насчет последнего: иными словами, если я использую сигнал clicked(bool), то я не могу его соединить со слотом, который принимает int, я правильно понял?
И еще, а как мне тогда определить, какое значение установить? Вообще, я хочу сделать так:
создается диалоговое окно мастера с двумя страницами: на каждой из них по 4 радиокнопки. Я хочу, чтобы по закрытию окна я мог определить, какая из кнопок была выбрана на каждой из страниц.
Сейчас я думал сделать так: создаю две интовые переменные, указателями которых я инициализирую поля диалогового окна. Далее, я создаю слот, который меняет значение по адресу, на который ссылает указатель. Таким образом, я бы запомнил что было выбрано в окне.
0
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 834
31.03.2017, 11:38 4
HepoH, запятую в конце не ставь и ругаться не будет. Там должно быть 4 параметра. Я же привел примеры.
C++ (Qt)
1
connect(отправитель, SIGNAL(сигнал([параметры])), приемник, SLOT(слот([параметры])));
Выбрана может быть только одна кнопка на каждой странице? Мол, нажал первую, остальные 3 выключились (2 остались в своих выключенных состояниях, а та, что была включенной - выключилась). Так?
Если так, то
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
QPushButton* one = new QPushButton(this);
QPushButton* two = new QPushButton(this);
QPushButton* three = new QPushButton(this);
QPushButton* four = new QPushButton(this);
QList<QPushButton*> buttons = QList<QPushButton*>() << one << two << tree << four; //лист объяви в заголовочнике, чтобы можно было достучаться до него из тела слота. Ну или вовсе делай без листа.
connect(one, SIGNAL(triggered(bool)), this, SLOT(onSomeButtonTriggered(bool)));
connect(two, SIGNAL(triggered(bool)), this, SLOT(onSomeButtonTriggered(bool)));
connect(three, SIGNAL(triggered(bool)), this, SLOT(onSomeButtonTriggered(bool)));
connect(four , SIGNAL(triggered(bool)), this, SLOT(onSomeButtonTriggered(bool)));
 
void MyClass::onSomeButtonTriggered(bool triggered)
{
 for (int i = 0; i < buttons.size(); i++)
buttons.at(i)->setChecked(!triggered); //всем кнопкам выставляешь противное значение от пришедшего
((QPushButton*)sender())->setChecked(triggered); //затем ставить нужное той кнопке, которая прислала сигнал
}
Пример очень грубый и лишь показывает некоторые возможности. Можно сделать и лучше. Но думать над тем, как - твоя задача.
1
1 / 1 / 1
Регистрация: 15.03.2016
Сообщений: 47
31.03.2017, 11:42  [ТС] 5
Горбаг, Запятую я не ставил. Однако, когда я перестал пытаться передать в слот свой параметр, подобная проблема исчезла.

За пример благодарю (сам пока просто создал 8 слотов, различающихся только тем, какое значение установить).
0
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 834
31.03.2017, 11:53 6
Всем кнопкам setCheckable(true) в начале еще установить надо. Забыл совсем.
0
683 / 458 / 160
Регистрация: 01.10.2015
Сообщений: 1,264
31.03.2017, 12:22 7
Горбаг, лучше использовать QButtonGroup, не придется вручную управлять состоянием членов группы
1
31.03.2017, 12:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.03.2017, 12:22
Помогаю со студенческими работами здесь

Подцепить внешние данные
Возможно ли в 1С наконфигурировать такую вещь? Задача: есть внешние данные, они могут быть на...

Подцепить игровой объект
Можно ли сделать так чтобы игровой обьект сам мог назначился на скрипт, а не через инспектор?

Не могу подцепить базу
День добрый, не могу подцепить базу, пишет следующее. SQL Server detected a logical...

Подцепить новую бд, и мемо
Здравствуйте! Накопилось пару вопросов, поскольку я совсем чайник, решил написать на форуме! ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru