crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Открытие одной формы по клику из другой
lex_qt
  опции профиля:
сообщение 15.12.2012, 17:04
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 15.12.2012
Пользователь №: 3644

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте форумчане. Изучаю Qt. Долгое время читал разбирался.
Но тут возник простой вопрос, но чтото не могу додуматься как реализовать.
Есть форма 1 , по сигналу (клик в контекстном меню либо из меню трея ) открывается форма 2.
Форма 1 не должна закрываться.
Проблема в том, сколько раз на кликаешь в контекстном меню, столько форм и откроется, а нужно чтобы открывалась только одна форма, независимо от количества кликов.

Функция
Цитата
void MainWindow::open_history()
{
history *hst = new history();
hst->show();

}


Вывод:
Цитата
connect(history, SIGNAL(triggered()), this, SLOT(open_history()));


Пробовал писать условие типа если форма видима то не открывать более, но чтото результата не дало.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Vass
  опции профиля:
сообщение 15.12.2012, 18:14
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 46
Регистрация: 17.3.2009
Из: Россия, Рыбинск
Пользователь №: 617

Спасибо сказали: 8 раз(а)




Репутация:   0  


void setWindowModality (Qt::WindowModality windowModality)


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

Сообщение отредактировал Vass - 15.12.2012, 18:40
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 15.12.2012, 18:23
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


А ты не создавай при каждом клике новую, просто show() вызывай
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lex_qt
  опции профиля:
сообщение 15.12.2012, 21:10
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 15.12.2012
Пользователь №: 3644

Спасибо сказали: 0 раз(а)




Репутация:   0  


Подскажите пожалуйста как прописать правильно в раздел класса?
Понимаю что вопрос нубский, но только изучаю. Возможно новчикам тоже пригодиться.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 15.12.2012, 21:14
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


в заголовочном файле твоего класса:

class MainWindow : public QMainWindow
{
    ... // Тут конструкторы, деструктор, функции
private:
    history *hst;      
}

Рекомендую книгу по С++ Павловской
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lex_qt
  опции профиля:
сообщение 15.12.2012, 22:01
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 15.12.2012
Пользователь №: 3644

Спасибо сказали: 0 раз(а)




Репутация:   0  


Так пробовал прописать, выходила ошибка при запуске, прописал в файле.h первой формы #include <history.h> программа запустилась, но при клике ( выполнения SIGNAL'a) ошибка.
При работе в Qt creater

при запуске самой программы

так понимаю какой то библиотеки не хватает на компьютере.

За книгу спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lex_qt
  опции профиля:
сообщение 15.12.2012, 22:43
Сообщение #7


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 15.12.2012
Пользователь №: 3644

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добавил библиотеки которые запрашивала программа, еще просила libgcc_s_dw2-1.dll
Теперь Qtcored4.dll необходим.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 16.12.2012, 1:43
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


оно еще кучу всего попросит. И все нужные dll лежат в ../Qt/(номер версии библиотеки)/bin

И если обобщить все выше сказанное, то тебе надо сделать как то так:

class MainWindow : public QMainWindow
{
    ... // Тут конструкторы, деструктор, функции
private:
    history *hst;

slots:
    void open_history();
}

MainWindow::MainWindow()
{
    history *hst = new history();
    connect(history, SIGNAL(triggered()), this, SLOT(open_history()));
}

void MainWindow::open_history()
{
    hst->show();
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FantasyOr
  опции профиля:
сообщение 16.12.2012, 17:25
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 75
Регистрация: 13.8.2010
Пользователь №: 1956

Спасибо сказали: 4 раз(а)




Репутация:   0  


зачем человека плохому учите... при подходе "сохранять указатель..." будет правильно работать если форма 2 вызывается только из формы 1, в случае же если это форма истории, то обычно она открывается из как минимум 2х мест: из формы списка сущностей и из формы просмотра-редактирования сущности. Тогда открыв форму истории из списка и попутно попытаетесь открыть из формы редактирования, у вас получится 2 формы истории причём запросто 2х разных сущностей.
Тут может быть 2 решения:
1) Сделать форму синглтоном (пишу с телефона не очень удобно код писать, но там не много переделывать )
2) в конструкторе формы истории добавить в свойства приложения свойство существования формы истории: qApp.setProperty("formHistory", true), в деструкторе устанавливать это свойство в false, а методах открытия истории проверяешь свойство, и если false создаёшь форму.
Но лучше сделать через синглтон-одиночка общепринятый паттерн, профит получишь, в резюме сможешь добавить "применяю паттерны программирования...".

чтоб нормально кампилилось и не нужно было в каждый проект таскать библиотеки, создай переменную среды path и qtdir для чего они и что должны содержать ищи а асистенте.
#include "history.h" - не угловые скобки, а кавычки


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

*недостаточно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FantasyOr
  опции профиля:
сообщение 16.12.2012, 18:19
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 75
Регистрация: 13.8.2010
Пользователь №: 1956

Спасибо сказали: 4 раз(а)




Репутация:   0  


что вы хотели сказать этим кодом
history *hst = new history();
connect(history, SIGNAL
(triggered()), this , SLOT
(open_history()));
?
когда у формы истории вызывается сигнал триггеред то она должна открыться... а как этот сигнал у формы вызовется если она не видна... пользователь подключен ментально к ПК, что умеет генерировать сигналы невидемых форм? Ясно, что нужно триггеред какого-нибудь экшена соединять со слотом открытия формы. И не нужно создавать форму истории при открытии мэйн формы(видимо список сущностей) иначе так можно докатиться до создания всех форм приложения... если в привычку войдёт Вы и все формы редактирования и диалогоаые окна сохранения, восстановления версий... будете создавать... плохие советы даёте.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 16:05