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

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

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

Author24 — интернет-сервис помощи студентам
Создаю в основной форме новую форму через
Код
NewForm *newForm = new NewForm(this);
newForm->show();
newForm->setAttribute(Qt::WA_DeleteOnClose);
Далее там же пытаюсь вызвать функцию в дочерней форме
Код
newForm->func();
Все вызывается, но при этом в основной форме код не продолжается, пока не выполнится код в дочерней. Как это избежать? Спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.10.2015, 05:31
Помогаю со студенческими работами здесь

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

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

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

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


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

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