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

Как вызвать функцию в дочерней форме

04.10.2015, 21:35. Показов 2535. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Создаю в основной форме новую форму через
Код
NewForm *newForm = new NewForm(this);
newForm->show();
newForm->setAttribute(Qt::WA_DeleteOnClose);
Далее там же пытаюсь вызвать функцию в дочерней форме
Код
newForm->func();
Все вызывается, но при этом в основной форме код не продолжается, пока не выполнится код в дочерней. Как это избежать? Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.10.2015, 21:35
Ответы с готовыми решениями:

Как правильно передать вектор в функцию и вызвать эту функцию?
Здравствуйте, объясните как исправить ошибку. Возникает после for(), выдается, что размер polygon =...

Меню в дочерней форме
Здравствуйте, форумчане. Подскажите, пожалуйста, один момент новичку. Создал главную форму,...

Как вызвать c++ функцию?
всем привет, уже перечиал кучу статей и примеров по qt, но нигде так и не увидел примера того как...

Как вызвать функцию в Qt с переменной, которая берется из другой формы?
Есть две формы (firstForm и MainWindow). В firstForm присутствует SpinBOX, из которого мне нужно...

20
104 / 98 / 40
Регистрация: 01.07.2012
Сообщений: 277
04.10.2015, 22:11 2
Можно пойти в лоб и создавать отдельный поток.
Но думаю, что лучше будет сделать функцию дочернего окна слотом, и в основной форме вызывать ее через сигнал. В таком случае в connect нужно обязательно указать флаг Qt::QueuedConnection.
1
2 / 2 / 0
Регистрация: 03.06.2012
Сообщений: 56
04.10.2015, 23:46  [ТС] 3
Цитата Сообщение от Vaiz Посмотреть сообщение
Можно пойти в лоб и создавать отдельный поток.
Но думаю, что лучше будет сделать функцию дочернего окна слотом, и в основной форме вызывать ее через сигнал. В таком случае в connect нужно обязательно указать флаг Qt::QueuedConnection.
у меня много одинаковых форм. и если я делаю через сигнал, то я обращаюсь сразу ко всем этим формам. А мне нужно к одной.
Как можно запустить саму форму в отдельном потоке?
0
104 / 98 / 40
Регистрация: 01.07.2012
Сообщений: 277
05.10.2015, 00:05 4
Цитата Сообщение от zagruzkaaa Посмотреть сообщение
у меня много одинаковых форм. и если я делаю через сигнал, то я обращаюсь сразу ко всем этим формам. А мне нужно к одной.
В таком случае можно определить в дочерней форме две функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Form
{
int a, b;
void func1()
{
    QtConcurrent::run(func2, this); // вызывает func2 в отдельном потоке
}
static void func2(Form *form)
{
    int c = form->a + form->b;
}
}
Но подозреваю, что есть варианты получше.

Цитата Сообщение от zagruzkaaa Посмотреть сообщение
Как можно запустить саму форму в отдельном потоке?
Через метод show форма вызывается в отдельном потоке. Иначе у вас активна была бы только одна форма.
1
2 / 2 / 0
Регистрация: 03.06.2012
Сообщений: 56
05.10.2015, 00:53  [ТС] 5
Цитата Сообщение от Vaiz Посмотреть сообщение
Через метод show форма вызывается в отдельном потоке. Иначе у вас активна была бы только одна форма.
а можно, как-то сделать чтоб после вызова show, сразу выполнялся какой-то метод этой формы?
0
104 / 98 / 40
Регистрация: 01.07.2012
Сообщений: 277
05.10.2015, 01:06 6
Цитата Сообщение от zagruzkaaa Посмотреть сообщение
а можно, как-то сделать чтоб после вызова show, сразу выполнялся какой-то метод этой формы?
Можно переопределить функцию show
C++
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
class Form : public QWidget
{
 
public slots:
void show();
 
signals:
void showed();
 
private slots:
void onShowed();
 
private:
static void onShowedThread(Form *form);
}
 
void Form::show()
{
QWidget::show();
 
// 1й вариант, через сигнал вызывать функцию
emit showed();
 
// 2й вариант, вызывать отдельный поток
QtConcurrent::run(onShowedThread, this);
 
// 3й вариант, просто вызвать нужную функцию
onShowed();
}
1
690 / 463 / 161
Регистрация: 01.10.2015
Сообщений: 1,272
05.10.2015, 01:12 7
Цитата Сообщение от Vaiz Посмотреть сообщение
Можно переопределить функцию show
скажите, а можно переопределить обработчик события show, ведь оно генерируется в том числе и после вызова show()? и в нем что-либо выполнить или вызвать метод
0
2 / 2 / 0
Регистрация: 03.06.2012
Сообщений: 56
05.10.2015, 01:57  [ТС] 8
Я сделал так:
создаю новую форму, в которой коннекчу сигнал на запуск нужной функции.
запускаю сигнал.
В этой самой функции я диссконекчу сигнал.

и вроде все норм, сигнал в итоге доходит только до одной формы.
Но когда я создаю новую форму, действия в других формах прекращаются до тех пор, пока не закончится действие в новой форме...

Добавлено через 18 минут
Как можно тупо запустить новую форму, чтоб она работала вообще независимо от остальных?
0
690 / 463 / 161
Регистрация: 01.10.2015
Сообщений: 1,272
05.10.2015, 04:28 9
C++ (Qt)
1
2
3
NewForm *newForm = new NewForm(this);
newForm->show();
newForm->setAttribute(Qt::WA_DeleteOnClose);
метод setAttribute(Qt::WA_DeleteOnClose) из 3 строки перенесите прямо прямо в тело конструктора NewForm, если вы постоянно создаете формы с атрибутом Qt::WA_DeleteOnClose, то хотя бы сэкономите на вводе.

Цитата Сообщение от zagruzkaaa Посмотреть сообщение
Далее там же пытаюсь вызвать функцию в дочерней форме
Цитата Сообщение от zagruzkaaa Посмотреть сообщение
Все вызывается, но при этом в основной форме код не продолжается, пока не выполнится код в дочерней.
Любой процесс при запуске имеет хотя один поток, так как сам по себе процесс не исполняется, этот первый поток является основным. Поток на всем протяжении своего существования обрабатывает цикл событий, все сообщения и события попадают в этот цикл, и поток поочередно обрабатывает их (хотя есть виды событий, обрабатываемых асинхронно).

Описанная вами ситуация означает, что все исполняется в одном потоке и все события обрабатываются в цикле событий главного потока - пока поток занят отработкой события из дочерней формы, события родительской попадают в очередь... и если выполняемая операция является затратной в смысле времени выполнения, то она блокирует всю очередь.

Чаще всего это операции ввода-вывода (файловая система, работа через сеть с большими задержками, и тому подобные вещи), продолжительность которых вам заранее не известна и не прогнозируема.

Цитата Сообщение от Vaiz Посмотреть сообщение
Можно пойти в лоб и создавать отдельный поток.
Можно... но сперва лучше проанализировать узкие места существующей реализации, найти все блокирующие операции, и если они не связаны с визуализацией гуя, то вынести все это дело в отдельные классы, код которых и будет выполняться в отдельном потоке/потоках, а основной поток будет отвечать только за интерфейс с пользователем.

ИМХО: если ТС все же примет решение еще и графический интерфейс "раскидать" по разным потокам, к чему он явно склоняется - то это заведомо тупиковый путь
0
2 / 2 / 0
Регистрация: 03.06.2012
Сообщений: 56
05.10.2015, 04:43  [ТС] 10
Цитата Сообщение от 0x90h Посмотреть сообщение
Можно... но сперва лучше проанализировать узкие места существующей реализации, найти все блокирующие операции, и если они не связаны с визуализацией гуя, то вынести все это дело в отдельные классы, код которых и будет выполняться в отдельном потоке/потоках, а основной поток будет отвечать только за интерфейс с пользователем.
ИМХО: если ТС все же примет решение еще и графический интерфейс "раскидать" по разным потокам, к чему он явно склоняется - то это заведомо тупиковый путь
а если выносить в отдельный поток функции из этой формы, то будет нормально? Если да, то как это сделать?
через QtConcurrent не понимаю, как связываться коннектом с потоком?
0
690 / 463 / 161
Регистрация: 01.10.2015
Сообщений: 1,272
05.10.2015, 04:54 11
Цитата Сообщение от zagruzkaaa Посмотреть сообщение
у меня много одинаковых форм. и если я делаю через сигнал, то я обращаюсь сразу ко всем этим формам. А мне нужно к одной. Как можно запустить саму форму в отдельном потоке?
Это одна из возможных сигнатур метода connect:

C++ (Qt)
1
QMetaObject::Connection connect(const QObject * sender, PointerToMemberFunction signal, const QObject * receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)
Странновато как-то у вас получается, даже если вы создаете много форм одного типа, например NewForm, то имена указателей receiver (получателей сигнала) уж точно будут разными.

C++ (Qt)
1
2
NewForm *form1 = NewForm;
NewForm *form2 = NewForm;
Для примера:

C++ (Qt)
1
2
3
4
 
QLabel *label = new QLabel;
QLineEdit *lineEdit = new QLineEdit;
QObject::connect(lineEdit, &QLineEdit::textChanged, label,  &QLabel::setText);
вы можете создать сколь угодно много объектов типа QLabel и QLineEdit, но больше одного раза создать объекты с именами "label" и "lineEdit" - не получится.

Или я неверно понял смысл вашей фразы относительно множества одинаковых форм?

Добавлено через 3 минуты
Цитата Сообщение от zagruzkaaa Посмотреть сообщение
а если выносить в отдельный поток функции из этой формы
а что она собственно делает?
0
2 / 2 / 0
Регистрация: 03.06.2012
Сообщений: 56
05.10.2015, 05:01  [ТС] 12
Цитата Сообщение от 0x90h Посмотреть сообщение
вы можете создать сколь угодно много объектов типа QLabel и QLineEdit, но больше одного раза создать объекты с именами "label" и "lineEdit" - не получится.
получится, если вызывать функцию где все это создается много раз.
Когда я запустил форму и функцию на ней, в основной форме мне уже не важно что с это дочерней формой будет дальше.

Цитата Сообщение от 0x90h Посмотреть сообщение
а что она собственно делает?
передает пакеты по QUdpSocket
0
2 / 2 / 0
Регистрация: 03.06.2012
Сообщений: 56
05.10.2015, 05:01  [ТС] 13
del
0
690 / 463 / 161
Регистрация: 01.10.2015
Сообщений: 1,272
05.10.2015, 05:08 14
Цитата Сообщение от zagruzkaaa Посмотреть сообщение
получится, если вызывать функцию где все это создается много раз.
Цитата Сообщение от zagruzkaaa Посмотреть сообщение
передает пакеты по QUdpSocket
вы встроили QUdpSocket в графический виджет?
можно код проекта посмотреть?

Добавлено через 1 минуту
Цитата Сообщение от zagruzkaaa Посмотреть сообщение
Причина: из-за лагов запостил 2 раза
я тоже получил 502 ошибку, gateway error
0
2 / 2 / 0
Регистрация: 03.06.2012
Сообщений: 56
05.10.2015, 05:11  [ТС] 15
Цитата Сообщение от 0x90h Посмотреть сообщение
вы встроили QUdpSocket в графический виджет?
можно код проекта посмотреть?
да нет) в графический виджет я вывожу прогрессбар)

+ еще подскажите
при закрытии данной формы, если функция не закончила работу, выпадает segmentation fail. посмотрел через дебаг, при закрытии вызывается деструктор, а функция продолжает работу... как быть?
0
690 / 463 / 161
Регистрация: 01.10.2015
Сообщений: 1,272
05.10.2015, 05:13 16
закиньте проект в виде zip-вложения, мне все интереснее и интереснее становится))) а также все "непонятнее"...
1
2 / 2 / 0
Регистрация: 03.06.2012
Сообщений: 56
05.10.2015, 05:18  [ТС] 17
Цитата Сообщение от 0x90h Посмотреть сообщение
закиньте проект в виде zip-вложения, мне все интереснее и интереснее становится)))
да ну... там много всего закомменчено, много неиспользуемого. разбираться долго придется.
В чем суть:
при нажатии кнопки на основной форме создается моя дочерняя форма(она представляет собой отдельный класс), которая передает пакеты по сокету и выводит прогресс(кол-во пакетов из всего пакетов) на прогрессбар.
Вот и всё)
0
690 / 463 / 161
Регистрация: 01.10.2015
Сообщений: 1,272
05.10.2015, 05:24 18
вторичная форма никак не взаимодействует с исходной?
т.е. она просто инициирует запуск передачи через сокет, а статистика (передано n из м + прогресс-бар) выводится во вторичку?
количество и формат датаграмм жестко прошиваете в коде? все-таки с кодом было бы проще, посмотреть, как именно у вас реализовано
1
2 / 2 / 0
Регистрация: 03.06.2012
Сообщений: 56
05.10.2015, 05:25  [ТС] 19
Цитата Сообщение от 0x90h Посмотреть сообщение
вторичная форма никак не взаимодействует с исходной?
т.е. она просто инициирует запуск передачи через сокет, а статистика (передано n из м + прогресс-бар) выводится во вторичку?
совершенно верно
0
690 / 463 / 161
Регистрация: 01.10.2015
Сообщений: 1,272
05.10.2015, 05:31 20
сейчас попробую набросать код, отпишусь тогда попозже
1
05.10.2015, 05:31
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.10.2015, 05:31
Помогаю со студенческими работами здесь

Как во второй форме вызвать процедуру или функцию созданную в первой форме
Короче создал первую форму, в ней процедуру. Потом создал вторую форму и хотел в ней вызвать...

Как в дочерней форме определить какой контрол нажат в родительской форме
Есть textbox на дочерней форме и если на родительской форме нажат button1, то textbox остаётся со...

Как передать данные из MDI дочерней формы к Родительской форме?
У меня есть проект, который содержит основную форму/Main/.Из главной формы с помощью кнопки я...

Как получить значение из ячейки текущей строки DataGridView в дочерней форме?
Помогите новичку в C#. Форма2 вызывается из Формы1. На Форме1 есть DataViewGrid1 и ToolStrip1, в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Какой язык программировани­я лучший для разработки нейронных сетей
InfoMaster 20.01.2025
В современном мире технологий искусственные нейронные сети становятся неотъемлемой частью множества инновационных решений, от распознавания речи до автоматического управления транспортными. . .
Как подключить JavaScript файл в другом JavaScript файле
InfoMaster 20.01.2025
В современной веб-разработке организация кодовой базы играет ключевую роль в создании масштабируемых и поддерживаемых приложений. Модульность и правильное структурирование кода стали неотъемлемыми. . .
Как откатить изменения в исходниках, не внесенные в Git
InfoMaster 20.01.2025
При работе с системой контроля версий Git разработчики часто сталкиваются с необходимостью отменить внесенные изменения в исходном коде. Особенно актуальной становится ситуация, когда изменения еще. . .
В чем разница между px, in, mm, pt, dip, dp, sp
InfoMaster 20.01.2025
В мире цифрового дизайна и разработки интерфейсов правильный выбор единиц измерения играет ключевую роль в создании качественного пользовательского опыта. История развития систем измерений для. . .
Как изменить адрес удалённого репозитория (origin) в Git
InfoMaster 20.01.2025
В терминологии Git термин origin является стандартным именем для основного удаленного репозитория, с которым взаимодействует локальная копия проекта. Когда разработчик клонирует репозиторий с. . .
Как переместить последние коммиты в новую ветку (branch) в Git
InfoMaster 20.01.2025
При работе над проектом часто возникают ситуации, когда необходимо изолировать определенные изменения от основной линии разработки. Это может быть связано с экспериментальными функциями, исправлением. . .
Как вернуть результат из асинхронной функции в JavaScript
InfoMaster 20.01.2025
Асинхронное программирование представляет собой фундаментальную концепцию в JavaScript, которая позволяет выполнять длительные операции без блокировки основного потока выполнения программы. В. . .
Какой локальный веб-сервер выбрать
InfoMaster 19.01.2025
В современной веб-разработке локальные веб-серверы играют ключевую роль, предоставляя разработчикам надежную среду для создания, тестирования и отладки веб-приложений без необходимости использования. . .
Почему планшеты и iPad уже не так популярны, как раньше
InfoMaster 19.01.2025
Эра революционных инноваций История планшетов началась задолго до того, как эти устройства стали привычными спутниками нашей повседневной жизни. В начале 1990-х годов появились первые прототипы,. . .
Как самому прошить BIOS ноутбука
InfoMaster 19.01.2025
BIOS (Basic Input/ Output System) представляет собой важнейший компонент любого компьютера или ноутбука, который обеспечивает базовое взаимодействие между аппаратным и программным обеспечением. . .
Какой Linux выбрать для домашнего компьютера
InfoMaster 19.01.2025
Современные реалии выбора операционной системы В современном мире выбор операционной системы для домашнего компьютера становится все более важным решением, которое может существенно повлиять на. . .
Как объединить два словаря одним выражением в Python
InfoMaster 19.01.2025
В мире программирования на Python работа со словарями является неотъемлемой частью разработки. Словари представляют собой мощный инструмент для хранения и обработки данных в формате "ключ-значение". . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru