![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
lex_qt |
![]()
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 6 Регистрация: 15.12.2012 Пользователь №: 3644 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Здравствуйте форумчане. Изучаю Qt. Долгое время читал разбирался.
Но тут возник простой вопрос, но чтото не могу додуматься как реализовать. Есть форма 1 , по сигналу (клик в контекстном меню либо из меню трея ) открывается форма 2. Форма 1 не должна закрываться. Проблема в том, сколько раз на кликаешь в контекстном меню, столько форм и откроется, а нужно чтобы открывалась только одна форма, независимо от количества кликов. Функция Цитата void MainWindow::open_history() { history *hst = new history(); hst->show(); } Вывод: Цитата connect(history, SIGNAL(triggered()), this, SLOT(open_history())); Пробовал писать условие типа если форма видима то не открывать более, но чтото результата не дало. |
|
|
Vass |
![]()
Сообщение
#2
|
![]() Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 17.3.2009 Из: Россия, Рыбинск Пользователь №: 617 Спасибо сказали: 8 раз(а) Репутация: ![]() ![]() ![]() |
перечитал пост, понял что ответил не про то. Действительно зачем создавать форму каждый раз новую сохраните указатель на одну в поле класса и используйте всегда ее Сообщение отредактировал Vass - 15.12.2012, 18:40 |
|
|
mezmay |
![]()
Сообщение
#3
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 272 Регистрация: 13.7.2009 Из: Ростов-на-Дону Пользователь №: 904 Спасибо сказали: 16 раз(а) Репутация: ![]() ![]() ![]() |
А ты не создавай при каждом клике новую, просто show() вызывай
|
|
|
lex_qt |
![]()
Сообщение
#4
|
Новичок Группа: Новичок Сообщений: 6 Регистрация: 15.12.2012 Пользователь №: 3644 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Подскажите пожалуйста как прописать правильно в раздел класса?
Понимаю что вопрос нубский, но только изучаю. Возможно новчикам тоже пригодиться. |
|
|
mezmay |
![]()
Сообщение
#5
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 272 Регистрация: 13.7.2009 Из: Ростов-на-Дону Пользователь №: 904 Спасибо сказали: 16 раз(а) Репутация: ![]() ![]() ![]() |
в заголовочном файле твоего класса:
Рекомендую книгу по С++ Павловской |
|
|
lex_qt |
![]()
Сообщение
#6
|
Новичок Группа: Новичок Сообщений: 6 Регистрация: 15.12.2012 Пользователь №: 3644 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Так пробовал прописать, выходила ошибка при запуске, прописал в файле.h первой формы #include <history.h> программа запустилась, но при клике ( выполнения SIGNAL'a) ошибка.
При работе в Qt creater ![]() при запуске самой программы ![]() так понимаю какой то библиотеки не хватает на компьютере. За книгу спасибо! |
|
|
lex_qt |
![]()
Сообщение
#7
|
Новичок Группа: Новичок Сообщений: 6 Регистрация: 15.12.2012 Пользователь №: 3644 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Добавил библиотеки которые запрашивала программа, еще просила libgcc_s_dw2-1.dll
Теперь Qtcored4.dll необходим. |
|
|
Trisch |
![]()
Сообщение
#8
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: ![]() ![]() ![]() |
оно еще кучу всего попросит. И все нужные dll лежат в ../Qt/(номер версии библиотеки)/bin
И если обобщить все выше сказанное, то тебе надо сделать как то так:
|
|
|
FantasyOr |
![]()
Сообщение
#9
|
Студент ![]() Группа: Участник Сообщений: 75 Регистрация: 13.8.2010 Пользователь №: 1956 Спасибо сказали: 4 раз(а) Репутация: ![]() ![]() ![]() |
зачем человека плохому учите... при подходе "сохранять указатель..." будет правильно работать если форма 2 вызывается только из формы 1, в случае же если это форма истории, то обычно она открывается из как минимум 2х мест: из формы списка сущностей и из формы просмотра-редактирования сущности. Тогда открыв форму истории из списка и попутно попытаетесь открыть из формы редактирования, у вас получится 2 формы истории причём запросто 2х разных сущностей.
Тут может быть 2 решения: 1) Сделать форму синглтоном (пишу с телефона не очень удобно код писать, но там не много переделывать ) 2) в конструкторе формы истории добавить в свойства приложения свойство существования формы истории: qApp.setProperty("formHistory", true), в деструкторе устанавливать это свойство в false, а методах открытия истории проверяешь свойство, и если false создаёшь форму. Но лучше сделать через синглтон-одиночка общепринятый паттерн, профит получишь, в резюме сможешь добавить "применяю паттерны программирования...". чтоб нормально кампилилось и не нужно было в каждый проект таскать библиотеки, создай переменную среды path и qtdir для чего они и что должны содержать ищи а асистенте. #include "history.h" - не угловые скобки, а кавычки hst->show(); - бкдет не достаточно, если форма открыта, но находится за другой формой будет пичалька, поэтому форме истории нужно делать ещё и rise() - рассвет, выводит форму на первый план, возможно написал с ошибкой посмотри в асистенте как правильно писать. *недостаточно |
|
|
FantasyOr |
![]()
Сообщение
#10
|
Студент ![]() Группа: Участник Сообщений: 75 Регистрация: 13.8.2010 Пользователь №: 1956 Спасибо сказали: 4 раз(а) Репутация: ![]() ![]() ![]() |
что вы хотели сказать этим кодом
history *hst = new history(); connect(history, SIGNAL (triggered()), this , SLOT (open_history())); ? когда у формы истории вызывается сигнал триггеред то она должна открыться... а как этот сигнал у формы вызовется если она не видна... пользователь подключен ментально к ПК, что умеет генерировать сигналы невидемых форм? Ясно, что нужно триггеред какого-нибудь экшена соединять со слотом открытия формы. И не нужно создавать форму истории при открытии мэйн формы(видимо список сущностей) иначе так можно докатиться до создания всех форм приложения... если в привычку войдёт Вы и все формы редактирования и диалогоаые окна сохранения, восстановления версий... будете создавать... плохие советы даёте. |
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 21.4.2025, 11:29 |