crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Виртуальные функции и connect
Ponter
  опции профиля:
сообщение 4.6.2012, 15:27
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 4.3.2010
Пользователь №: 1504

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем привет. Есть код:
class Main
{
    public:
        Main();
    public slots:
        virtual void add() = 0;
};

class A : public Main
{
    public:
        A();
    public slots:
        void add();
};

class B : public Main
{
    public:
        B();
    public slots:
        void add();
};


Далее в некоем классе я пишу:
{
    Main *main = new Main();
    main = a;
    
    connect(this, SIGNAL(sgMainSignal()), main, SLOT(add()));
    
    A *a = new A();
    main = a;
    main->add(); //вызовет судя по виртуальным функциям A->add()
}

И вот тут встает вопрос: почему при connect вызывается слот класса Main, хотя указатель уже указывает на класс A?
Это решается новой записью, т.е.
A *a = new A();
main = a;
connect(this, SIGNAL(sgMainSignal()), main, SLOT(add()));
Но тогда другой вопрос: что будет если при каждой смене указателя (то на А, то на В) буду писать connect и считается ли это хорошим тоном?
Спасибо
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Ponter
  опции профиля:
сообщение 5.6.2012, 10:17
Сообщение #2


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 4.3.2010
Пользователь №: 1504

Спасибо сказали: 0 раз(а)




Репутация:   0  


1) это символическое имя
2) забыл удалить
А остальное поясню:
Есть кнопки: добавить,удалить,редактировать и куча всего. Эти кнопки нужны для каждого виджета, а их 3-5 будет. Мне проще сделать это через виртуальные функции. Кнопки находятся в QMainWindow.
Поэтому делая сигналы мне проще написать:
connect(ui->btnAdd, SIGNAL(triggered()), main, SLOT(add()));
connect(ui->btnEdit, SIGNAL(triggered()), main, SLOT(edit()));
connect(ui->btnDelete, SIGNAL(triggered()), main, SLOT(delete()));
Чем писать для каждого виджета слот, а если их будет штук 10 - не шибко грамотно получается. Сейчас у меня идет так:
connect(ui->btnAdd, SIGNAL(triggered()), mainwindow, SLOT(slAdd()));
//далее
void MainWindow::slAdd()
{
     //заранее вне функции я пишу, например, main = a;
     main->add();
}

и так для каждой кнопки, А потом еще и для каждого виджета я расписываю эти же add(). Было бы красиво написать так:
connect(ui->btnAdd, SIGNAL(triggered()), main, SLOT(add()));
Но при этом коннектится тот виджет на который первый раз ссылается main, если указатель меняется то, то видимо сначала и правда надо дисконнект и снова коннект. Что тоже некрасиво, но этот выход лучше, с точки зрения понимания кода.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.1.2025, 7:20