Виртуальные функции и connect |
Здравствуйте, гость ( Вход | Регистрация )
Виртуальные функции и connect |
Ponter |
4.6.2012, 15:27
Сообщение
#1
|
Студент Группа: Новичок Сообщений: 11 Регистрация: 4.3.2010 Пользователь №: 1504 Спасибо сказали: 0 раз(а) Репутация: 0 |
Всем привет. Есть код:
Далее в некоем классе я пишу:
И вот тут встает вопрос: почему при connect вызывается слот класса Main, хотя указатель уже указывает на класс A? Это решается новой записью, т.е. A *a = new A(); main = a; connect(this, SIGNAL(sgMainSignal()), main, SLOT(add())); Но тогда другой вопрос: что будет если при каждой смене указателя (то на А, то на В) буду писать connect и считается ли это хорошим тоном? Спасибо |
|
|
Алексей1153 |
4.6.2012, 20:17
Сообщение
#2
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 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 - не шибко грамотно получается. Сейчас у меня идет так:
и так для каждой кнопки, А потом еще и для каждого виджета я расписываю эти же add(). Было бы красиво написать так: connect(ui->btnAdd, SIGNAL(triggered()), main, SLOT(add())); Но при этом коннектится тот виджет на который первый раз ссылается main, если указатель меняется то, то видимо сначала и правда надо дисконнект и снова коннект. Что тоже некрасиво, но этот выход лучше, с точки зрения понимания кода. |
|
|
Алексей1153 |
5.6.2012, 11:17
Сообщение
#4
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
сделай так: тебе нужно написать некий класс
эту панельку размещай на любой виджет, а потом соединяй нужные сигналы вызовами методов панели Сообщение отредактировал Алексей1153 - 5.6.2012, 11:17 |
|
|
Текстовая версия | Сейчас: 25.1.2025, 2:18 |