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

Двойное открытие QDialog

17.07.2019, 12:16. Показов 906. Ответов 6

Author24 — интернет-сервис помощи студентам
Добрый день, столкнулся с проблемой. Когда в списке двойным щелчком открываю изображение создается окно класса photoReader (унаследован от QDialog). После его закрытия сразу создается такое же окно и после закрытия второго окна возвращается MainWindow.

C++ (Qt)
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
30
void MainWindow::on_currentFolder_doubleClicked(const QModelIndex &index)
{
    QListView* listView = qobject_cast< QListView* >(sender());
 
    QFileInfo fileInfo = model->fileInfo(index);
 
    if (fileInfo.fileName() == "..")
    {
        QDir dir = fileInfo.dir();
        dir.cdUp();
        listView->setRootIndex(model->index(dir.absolutePath()));
    }
    else if (fileInfo.fileName() == ".")
    {
        listView->setRootIndex(model->index(""));
    }
    else if (fileInfo.isDir())
    {
        listView->setRootIndex(index);
    }
    else if (fileInfo.completeSuffix() == "png" || fileInfo.completeSuffix() == "jpg")
    {
        hide();
        photoReaderWindow = new photoReader(fileInfo.absoluteFilePath());
        photoReaderWindow->exec();
        delete photoReaderWindow;
        show();
    }
 
}
Так же протестировал на обычной кнопке и с помощью нее все работает нормально и после закрытия не создается второе окно, а сразу возвращается окно MainWindow.

C++ (Qt)
1
2
3
4
5
6
7
8
void MainWindow::on_pushButton_clicked()
{
    hide();
    photoReaderWindow = new photoReader("/Users/kv/Pictures/oboi_5.jpg");
    photoReaderWindow->exec();
    delete photoReaderWindow;
    show();
}
Может есть способ это как-то побороть?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.07.2019, 12:16
Ответы с готовыми решениями:

Разница между QDialog::exec() и QDialog::Open()
Здравствуйте, уважаемые форумчане! Есть статический метод, который установлен как callback-функция...

Закрытие QDialog
Сразу прошу прощения за глупый вопрос. Есть виджет MainWindows, в нем создаю QDialog в нем всего...

QDialog close
Если я буду использовать hide() То диалог останется в памяти? И почему close() закрывает и...

QDialog расположение
Привет. Есть класс(плейлист), наследую от QDialog. При открытии плейлиста, он появляется в...

6
284 / 173 / 62
Регистрация: 13.03.2019
Сообщений: 419
17.07.2019, 15:47 2
Цитата Сообщение от kavars Посмотреть сообщение
Может есть способ это как-то побороть?
Может, ты дважды вызвал connect() для соединения on_currentFolder_doubleClicked(). Есть вариант, что у тебя одно соединение создаётся автоматически, а второе ты делаешь в явном виде.
1
0 / 0 / 0
Регистрация: 20.01.2019
Сообщений: 12
17.07.2019, 16:17  [ТС] 3
Анна по жизни, перепроверил, ни где в коде явно не вызываю connect() для on_currentFolder_doubleClicked().
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
17.07.2019, 16:28 4
Цитата Сообщение от kavars Посмотреть сообщение
ни где в коде явно не вызываю connect() для on_currentFolder_doubleClicked()
Это не с кодом связано, а с называнием слота. В вызове QMetaObject::connectSlotsByName(***), который генерируется для любой сгенерированной из ui формы, слоты с названиями, правильным образом совпадающими с называниями виджетов и сигналов, будут автоматически подключены к ним. Простейшее решение - не использовать в начале слота приставку on_ , а например ON_ или slot_
0
278 / 87 / 37
Регистрация: 10.06.2015
Сообщений: 261
17.07.2019, 17:22 5
Цитата Сообщение от TRam_ Посмотреть сообщение
Это не с кодом связано, а с называнием слота.
Цитата Сообщение от kavars Посмотреть сообщение
ни где в коде явно не вызываю connect() для on_currentFolder_doubleClicked()
Цитата Сообщение от TRam_ Посмотреть сообщение
правильным образом совпадающими с называниями виджетов и сигналов, будут автоматически подключены к ним
Ну, если я правильно понял, только так у него слот и подключен (по совпадающему имени). Не два же раза он автоматически подсоединился.
0
284 / 173 / 62
Регистрация: 13.03.2019
Сообщений: 419
17.07.2019, 20:06 6
ещё вариант - поставить у вьювера в свойстве editTriggers() флажок DoubleClicked.

Добавлено через 36 минут
Не то.

Добавлено через 2 минуты
Самое простое - посмотреть отладчиком, откуда попадаешь в создание диалога.
0
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
19.07.2019, 12:42 7
TRam_ все правильно сказал. Сам в начале карьеры на эти грабли наступал. Отучился именовать функции снейк-кейсом - проблема двойного вызова ушла.
0
19.07.2019, 12:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.07.2019, 12:42
Помогаю со студенческими работами здесь

Передача сообщения в QDialog
Добрый день, или ночь тому кто трудится... Создаю чат. Имеется MainWindow - где на экран выводятся...

Вызов QDialog::Accepted
Здравствуйте! На форму кинул QDialogButtonBox. Сам класс формы наследуется от QDialog. При...

Взаимодействие нескольких QDialog
Всем доброго времени суток. Проблема такая: есть два QDialog. Как сделать так, чобы при нажатии...

QDialog, QApplication и exec()
Пишу программу, есть окно авторизации. Собственно в main создаю диалог авторизации (LoginDialog) и...


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

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