Qt сигналы и слоты. Передать переменную в материнскую форму из дочерней
В общем, встала такая задача - узнать, отрыта ли форма "about" или нет, для того чтобы не открывать ее дубликат. Решил реализовать проверку через сигналы и слоты. Допустим, я нажимаю кнопку F1, посылается сигнал в дочернюю форму, там переменная инкрементируется и возвращается обратно. Если инкрементация не произошла, или переменная вовсе не вернулась, то, стало быть, программа считает что форма либо не открыта либо даже вовсе не открывалась. Вызов дочерней формы происходит так:
int AboutStatus = 1;
QPointer<about> frm = new about;
connect(this,SIGNAL(send(int)),frm,SLOT(getSended(int)));
emit send(AboutStatus);
frm->show();
Ну и вот тут мне непонятно кое-что... Во-первых, весь этот connect не работает без
QPointer<about> frm = new
или
about *frm = new about;
А мне ведь не надо открывать главную форму по-новой. И главное, непонятно чем в дочерней форме заменить
connect(this,SIGNAL(send(int)),frm,SLOT(getSended(int)));
Чтобы передать переменную в слот родительской формы.
Ответы (3 шт):
А зачем это делать именно сигналами? Не проще это делать мьютексами?
Определить глобальный QMutex в mainwindow, при инициализации формы пытаться заблокировать мьютекс и при неудаче выходить
Есть пара способов сделать эту проверку.
Вариант 1. В методе показа окна объявить статическую переменную/указатель данного окна
void Window::showAbout() {
static About about;
about.setVisible(!about.isVisible());
}
Вариант 2. Поле класса.
class Window {
private:
void showAbout() {
about.setVisible(!about.isVisible());
}
About about;
}
Вариант 3. Показывать окно в модальном режиме (About должно наследовать QDialog, или самостоятельно реализовать использование QEventLoop)
void Window::showAbout() {
About about;
about.exec();
}
Вариант 4. Создавать указатель и удалять после закрытия окна
void Window::showAbout() {
About* about = new About();
connect(about, &About::finished, about, &About::deleteLater(), Qt::QueueConnection);
about->show();
}
Вариант 5. Блокировать пункт меню (Disable) пока окно открыто и отлавливать событие QDialog::finished, или какое-нибудь кастомное
Нашел способ отправить сигнал в дочернюю форму, хоть это и не решило моей проблемы, так как сигналы отрабатываются даже если форма не видна. Так или иначе, тут вся фишка в том, что connect надо прописывать в исходнике материнской формы, а не в дочерней, и выглядеть это должно примерно следующим образом:
connect(About, &about::signalSend, this, &MainWindow::slotCatch);