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 и считается ли это хорошим тоном?
Спасибо
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 4.6.2012, 20:17
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


1 ) не стоит пользоваться именем "main" - это так, на будущее
2 ) почему указатель "a" использован до объявления ?
3 ) а можно ли делать слоты виртуальными ? Или - какой в этом смысл ?
4 ) "почему при connect вызывается слот класса Main" - слот Add() есть у всех трёх классов. Указывай на здрровье ))

5 ) каждый коннект будет создавать дополнительный вызов слота. Чтобы избежать этого, нужно либо дисконнектить, либо указывать флаг неповторности коннекта

====================

и ещё - расскажи, что ты хочешь сделать ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Ponter
  опции профиля:
сообщение 5.6.2012, 10:17
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 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, если указатель меняется то, то видимо сначала и правда надо дисконнект и снова коннект. Что тоже некрасиво, но этот выход лучше, с точки зрения понимания кода.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 5.6.2012, 11:17
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


сделай так: тебе нужно написать некий класс

class QMyPanel:QWidget
{
    Q_OBJECT
public:
    QMyPanel(QWidget* parent);

    enum ee_button
    {
        e_button_1,
        e_button_2,
        e_button_3,
    };

    typedef std::map<ee_button, QWidget*> td_buttons;

    td_buttons m_buttons;//массив кнопок

};

QMyPanel::QMyPanel(QWidget* parent):QWidget(parent)
{
    //
}


эту панельку размещай на любой виджет, а потом соединяй нужные сигналы вызовами методов панели

Сообщение отредактировал Алексей1153 - 5.6.2012, 11:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 26.4.2024, 10:51