Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Alexu007 от Май 19, 2013, 21:53



Название: Вторая форма в проекте.
Отправлено: Alexu007 от Май 19, 2013, 21:53
Делаю по нагугленному: http://easy-qt.blogspot.ru/2012/10/1.html

Добавил в проект вторую форму, она по умолчанию назвалась не Form, а Ui_Form. Ну да ладно. Файлы .h и .cpp в проекте почему-то не показываются.

добавил #include "ui_form.h"

в объявлении класса создал указатель на новую форму   private:   Ui_Form *myform;

в конструкторе создал новую форму: myform = new Ui_Form();

ругается на строчку:

connect(ui->pushButton, SIGNAL(clicked()), myform, SLOT(show()));

1. Чё ей не нравится?
2. Я не хочу выводить форму на экран по нажатию кнопки. Я хочу вставить show() в конструктор, чтобы на экране сразу появлялись 2 формы. Это можно сделать?



Название: Re: Вторая форма в проекте.
Отправлено: qwyllum от Май 19, 2013, 22:56
Прошу прощения за свои ламерские пять копеек. А почему бы не создать еще один класс на основе Dialog и не работать с ним? Qt сам сгенерит необходимый код. А в главной файле можете связать требуемые сигналы и слоты.


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Май 20, 2013, 07:50
Прошу прощения за свои ламерские пять копеек. А почему бы не создать еще один класс на основе Dialog и не работать с ним? Qt сам сгенерит необходимый код. А в главной файле можете связать требуемые сигналы и слоты.
Только потому, что в примере создаётся ещё один клас на основе Widget - и я сделал так же. Но сигналы и слоты почему-то не связываются. Попробую сделать то же самое с Dialogом.


Название: Re: Вторая форма в проекте.
Отправлено: Serr500 от Май 20, 2013, 08:28
ругается на строчку:

connect(ui->pushButton, SIGNAL(clicked()), myform, SLOT(show()));
Как именно ругается?


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Май 20, 2013, 15:36
Заморочки с добавлением формы в проект - добавляется только файл form.ui, а h и cpp нет.


Мля... разобрался. Нужно было добавлять класс form, а я всё пытался добавить только форму, ну она и добавлялась...




Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Май 20, 2013, 18:23
Ну боле мене получилось, хочу такой дизайн. А как сделать, чтобы окна рисовались на раб. столе в определённом месте? Сейчас все три рисуются по центру, приходится раздвигать вручную.

У квадратных форм отключить (сделать неактивным) красный крестик, чтобы их нельзя было закрыть, только вместе с 3-м окном.

И еще ламерский вопрос. Мне нужна глобальная переменная, которую было бы видно во всех трёх модулях. Где её объявить?


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Май 21, 2013, 00:07
В файле widget.h

Код
C++ (Qt)
class ABC
{
public:
   static int table[10][10];
};

в файле widget.cpp

Код
C++ (Qt)
void Widget::MyEventHandler1()
   {
   ABC.table[1][1] = 5;
 
   return;
   }

ругается: C:\QtSDK\Alexu007\MBoy\untitled\widget.cpp:58: ошибка: expected unqualified-id before '.' token


Название: Re: Вторая форма в проекте.
Отправлено: Serr500 от Май 21, 2013, 08:19
ABC::table


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Май 21, 2013, 15:26
Спасиб большое. В общем, я выкрутился по другому: я перенес paintEventы и mousePressEventы в файл основной формы - и они "увидели" глобальные переменные! А вообще, что за хрень такая - область видимости файл? Кто это придумал? Мне приходится переписывать код программы в зависимости от того, в одном файле она написана или в нескольких...



Название: Re: Вторая форма в проекте.
Отправлено: Bepec от Май 21, 2013, 17:20
Глобальные переменные - зло.
Да, без них иногда не обойтись, да, они нужны. Но злоупотреблять ими нельзя.

Область видимости только та, которую вы даёте переменной.


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Май 21, 2013, 18:55
В программе 3 формы: основная Widget и две вспомогательные Form_comp и Form_homo. На виджете прогрессбар, при клике кнопкой в Form_comp вызывается обработчик нажатия кнопки:

Код
C++ (Qt)
//обрабатывает клики мышкой в форме компьютера
void Form_comp::mousePressEvent( QMouseEvent *mouseEvent )
   {
 
 
   mouse_x = mouseEvent->x() / 25;
   mouse_y = mouseEvent->y() / 25;
 
   if(pole_Comp[mouse_x][mouse_y] == 0) pole_Comp[mouse_x][mouse_y] = 1;
   else pole_Comp[mouse_x][mouse_y] = 0;
 
   update();
 
   return;
   }

Как в обработчик Form_comp::mousePressEvent прикрутить progressBar_Homo->setValue(mouse_x * 10); из другой формы? Чтобы по нажатию кнопки в одной форме менялись показания progressBar в другой?


Название: Re: Вторая форма в проекте.
Отправлено: kambala от Май 21, 2013, 20:04
сигнал отправлять например, а коннектить в Widget


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Май 22, 2013, 08:38
Спасиб, получилось.

А такой ещё вопрос: я когда запускю Qt и открываю проект, у меня каждый раз открывается окно "мои документы", и приходится каждый раз вручную кликать: диск С - QtSDK - Alexu007 - MBoy - untitled. А нельзя сделать, чтобы он на предыдущем проекте открывался?


И ещё: мне пришлось перетащить из form_homo.cpp в widget.cpp функции только потому, что они не видят глобальных переменных, объявленных в файле widget.cpp. Оно конечно и так работает, но в widget.cpp теперь многа функций, а form_homo.cpp стоит пустой. Как сделать, чтобы глобальная переменая была видна во всём проекте, а не только в файле, где она объявлена? С таким подходом мне ваще придётся всю программу в один файл запихивать...

Пробовал объявлять глобальные переменные в файле .h - компилятор ругается зараза...


Название: Re: Вторая форма в проекте.
Отправлено: lighting от Май 22, 2013, 10:23
я когда запускю Qt и открываю проект, у меня каждый раз открывается окно "мои документы", и приходится каждый раз вручную кликать: диск С - QtSDK - Alexu007 - MBoy - untitled. А нельзя сделать, чтобы он на предыдущем проекте открывался?
Инструменты -> Параметры -> Сборка и запуск -> Основное -> Каталог проектов


Название: Re: Вторая форма в проекте.
Отправлено: kambala от Май 22, 2013, 11:51
И ещё: мне пришлось перетащить из form_homo.cpp в widget.cpp функции только потому, что они не видят глобальных переменных, объявленных в файле widget.cpp. Оно конечно и так работает, но в widget.cpp теперь многа функций, а form_homo.cpp стоит пустой. Как сделать, чтобы глобальная переменая была видна во всём проекте, а не только в файле, где она объявлена? С таким подходом мне ваще придётся всю программу в один файл запихивать...
в form_homo.cpp пишешь где-нибудь в начале extern int myvar;
Пробовал объявлять глобальные переменные в файле .h - компилятор ругается зараза...
потому что их надо еще инициализировать значением в .cpp


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Май 22, 2013, 14:00
Спасибо большое, вы оба мне очень помогли.  :)


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Май 22, 2013, 18:15
Чё то я затупил с изменением цвета progressBar с зелёного на красный. Вроде и пример где-то видел, где цвет меняется. Не могу найти нигде... Как?


Название: Re: Вторая форма в проекте.
Отправлено: kambala от Май 22, 2013, 18:26
в справке по Qt style sheet


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Май 22, 2013, 19:22
Код
C++ (Qt)
ui->progressBar_Homo->setStyleSheet
("QProgressBar::chunk {background: qlineargradient(x1: 0, y1: 0.5, x2: 1, y2: 1.5, stop: 0 red, stop: 1 white);}");

Это меняет цвет, но прогрессбар некрасивый становится, неанимированный... по другому никак?


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Май 23, 2013, 13:07
Как сделать кнопку активной/неактивной? Пишу:

Код
C++ (Qt)
// сигнал
void play_EnDiz(bool);
 
//отправляю
if...     play_EnDiz(true);
else    play_EnDiz(false);
 
//слот
void enabledChange(bool x);
 
//соединяю
QObject::connect(FH, SIGNAL(play_EnDiz(bool)), ui->pushButton_2->enabledChange(x);, SLOT(BPL_EnDiz(x)));
 

Я пробовал в слоте переключать enabledChange, не получается



Название: Re: Вторая форма в проекте.
Отправлено: kambala от Май 23, 2013, 17:19
connect(FH, SIGNAL(play_EnDiz(bool)), ui->pushButton_2, SLOT(setEnabled(bool)));


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Май 24, 2013, 14:16
Почему не работает

Код
C++ (Qt)
#include <QTest>
...
QTest::qWait(1000)


Название: Re: Вторая форма в проекте.
Отправлено: kambala от Май 24, 2013, 16:30
опробую свой дар телепата:
1. отсутствует ;
2. QT += testlib


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Май 24, 2013, 16:37
А как по другому можно паузу в програме организовать?


Название: Re: Вторая форма в проекте.
Отправлено: kambala от Май 24, 2013, 16:44
можно банально через sleep(), но это подвесит окно. смотря для чего пауза нужна.


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Май 24, 2013, 17:00
На sleep() ругается, может библиотеку какую подключать нужно?


Название: Re: Вторая форма в проекте.
Отправлено: Bepec от Май 24, 2013, 17:03
windows.h


Название: Re: Вторая форма в проекте.
Отправлено: mutineer от Май 24, 2013, 17:03
Раз ругается, нужно взять эту ругань и скопировать ее сюда или в поисковик


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Май 24, 2013, 17:14
windows.h
не помогает

Раз ругается, нужно взять эту ругань и скопировать ее сюда или в поисковик
Код
C++ (Qt)
sleep(1000);

C:\QtSDK\Alexu007\MBoy\untitled\widget.cpp:190: ошибка: 'sleep' was not declared in this scope


Название: Re: Вторая форма в проекте.
Отправлено: kambala от Май 24, 2013, 17:16
Sleep() под виндой. научись хоть гуглом пользоваться.


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Май 24, 2013, 17:41
Sleep() под виндой. научись хоть гуглом пользоваться.

У меня всё под виндой! Гугл посоветовал:
Код
C++ (Qt)
#define private public
#include <QThread>
 
QThread::msleep(5000);


но так не заработало, написало что QThread::msleep() протектед. Но когда я кликнул на ошибку, у меня открылся до этого невидимый мне файл, в котором как раз и protected: QThread::msleep(). Тогда я перенёс ету строчку в в public: и заработало! Что я наделал? Я сломал Qt?


Название: Re: Вторая форма в проекте.
Отправлено: mutineer от Май 24, 2013, 17:43
Камбала говорил тебе о том, что под вендами Sleep с большой буквы пишется


Название: Re: Вторая форма в проекте.
Отправлено: Majestio от Май 24, 2013, 17:44
Тогда я перенёс ету строчку в в public: и заработало! Что я наделал? Я сломал Qt?
Ты чуть не удалил интернет!  8)


Название: Re: Вторая форма в проекте.
Отправлено: kambala от Май 24, 2013, 17:46
суровый дефайн конечно… нет, ты ничего не сломал, но изменил библиотеку. это значит, что никто другой не сможет скомпилировать твой код без внесения таких же правок в библиотеку.



Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Май 24, 2013, 17:59
Наконец то дошло про Sleep с большой буквы. Спасибо. Туповат я немного... А как теперь библиотеку назад починить?


Название: Re: Вторая форма в проекте.
Отправлено: kambala от Май 24, 2013, 20:05
вернуть метод назад в секцию protected очевидно


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Май 24, 2013, 20:23
вернуть метод назад в секцию protected очевидно
Да эт понятно, но как эту библиотеку на экран вернуть? Ошибки больше нет, Qt её не показывает...

А вообще удивительно, что Qt так легко позволяет библиотеки редактировать ломать всяким начинающим. Хоть бы предупредил.


Название: Re: Вторая форма в проекте.
Отправлено: kambala от Май 24, 2013, 20:40
Qt4\include\QtCore\qthread.h или Qt5\qtbase\include\QtCore\qthread.h

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


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 05, 2013, 14:50
Получается примерно такая прога - игра Морской Бой. На картинке раненые, убитые и целые корабли. Пара вопросов:

1. Когда я кликаю мышкой на форму, она становится активной - границы подкрашиваются и тень появляется. Можно ли переключать это программно? SetFocus() не помогает.

2. Клики мышкой на форме (сигналы) накапливаются, а мне хотелось бы обрабатывать только нужные. Как удалить лишние? Гдето ведь видел, когда понадобилось никак не могу найти.


Название: Re: Вторая форма в проекте.
Отправлено: kambala от Июнь 05, 2013, 16:52
1. QWidget::activateWindow() и/или QWidget::raise()
2. disconnect()


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 05, 2013, 19:38
Со вторым пунктом непонятно. Попробую объяснить, что я хочу. В начале игры ожидается ход человека - клик мышкой в игровое поле компьютера. При клике вызывается функция:

Код
C++ (Qt)
void Form_comp::mousePressEvent( QMouseEvent *mouseEvent )
   {
 
   if(set_Action != 2) {Beep(4000, 500); return;}
 
   set_Action = 0;
 
   mouse_x = mouseEvent->x() / 25;
   mouse_y = mouseEvent->y() / 25;
 
   emit processGame();
 
   return;
   }

которая помещает в глобальные переменные координаты клика и запускает функцию processGame(), что и есть собственно игра. Там анализируется ход, и в зависимости от результата (попал, мимо, ошибка) ход либо передаётся компьютеру, либо возвращается человеку (при этом set_Action = 2). Блокировка if(set_Action != 2) {Beep(4000, 500); return;} не работает - клики мышкой всё равно помещаются в какую-то очередь, дожидаются когда set_Action станет равным 2 и осуществляется ход человека.



Название: Re: Вторая форма в проекте.
Отправлено: mutineer от Июнь 05, 2013, 19:47
слот, подписанный на processGame() работает в главном потоке приложения? Если да, то никто не ждет пока set_Action станет равным 2, события просто ждут своей очереди пока слот не закончит выполнение


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 05, 2013, 20:18
Да, у меня только один поток. Но в set_Action я ставлю двойку, только когда нужно отдать ход человеку. А в остальное время там 0, который прописывается в самом обработчике событий мышки. Поэтому при "лишних" кликах я ожидаю звуковой сигнал и выход из обработчика без каких-либо действий по строчке:

Код
C++ (Qt)
if(set_Action != 2) {Beep(4000, 500); return;}

Но этого не происходит. Нигде в программе в set_Action ошибочно двойки не записываются, я поиском проверял.


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 05, 2013, 20:28
Блин, дошло почему. Управление из processGame обратно в обработчик мыши возвращается, и новый клик не обрабатывается, пока старый не обработан. Вот они и ждут где-то в очереди.

А чё делать? А если не processGame вызвать, а таймер, а из таймера уже processGame - управление всё равно в обработчик мыши вернётся?


Название: Re: Вторая форма в проекте.
Отправлено: mutineer от Июнь 05, 2013, 20:43
processGame долго выполняется? Кстати, если это просто метод, то зачем возле него emit? Сбивает с толку


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 05, 2013, 21:21
processGame выполняется долго - там специально паузы вставлены, иначе игры не получится. emit - потому что processGame сигнал и связан со слотом void Widget::proc_Game() на другой форме. Программа состоит из 3-х форм, они все связаны, в двух формах игровые поля компа и человека, а в третьей основной - индикаторы, сколько у кого кораблей убито.

Взаимодействие между формами с помощью сигналов и слотов, мне тут так подсказали.

Поэтому я и в непонятках. Я то думал: кликнул мышкой - выскочило прерывание мышки  - отправило сигнал для продолжения игры на другую форму - и на этом прерывание мышки закончилось. А получается что не так.


Название: Re: Вторая форма в проекте.
Отправлено: mutineer от Июнь 05, 2013, 21:24
Пока выполняется твой proc_Game() все остальное стоит, поэтому все входящие события от системы накапливаются в очередь. Зачем там паузы? Какую роль они играют?


Название: Re: Вторая форма в проекте.
Отправлено: mutineer от Июнь 05, 2013, 21:28
mousePressEvent это не прерывание, это метод, и отрабатывает он в главном потоке. Поэтому пока главный поток занят он отработать не может


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 05, 2013, 21:33
Ну да, стоит, ну да - накапливаются, и что с этим делать? Я вообще то думал, что прерывание мышки при каждом клике сразу возникает, не дожидаясь пока там где-то что-то кончится - поэтому и пытался его "зареторнить", когда оно не вовремя. Но так не работает. Но в других то програмах это как-то обходят? Те же шахматы - если я 10 раз кликну по доске, пока компьютер думает - он мои клики проигнорирует.


Название: Re: Вторая форма в проекте.
Отправлено: mutineer от Июнь 05, 2013, 21:35
Выноси долгие рассчеты в отдельный поток. а основной пусть отвечает на мышку и игнорирует ее когда не надо


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 05, 2013, 21:41
Зачем там паузы? Какую роль они играют?

Ну как же? Я кликаю мышкой в поле компа, если сразу появляется результат (попал-мимо) то уже некрасиво - нужны паузы. Клик - через паузу (0,8 сек у меня Sleep(800)) не экране результат появляется, ещё через паузу ход компу отдаётся (если мимо) - активируется форма поля человека - пауза - туда комп ходит - пауза - либо попал и продолжает ходить, либо отдаёт ход челу - активируется форма компа. Без пауз всё будет происходить мгновенно и ничего не понятно будет.

Добавлено: какие там долгие рассчёты в морском бое "С2 ранен В2 убит"? Паузы исскуственные с помощью Sleep().


Название: Re: Вторая форма в проекте.
Отправлено: mutineer от Июнь 05, 2013, 21:44
Sleep() тормозит твой основной поток и ничего в это время не обрабатывается. Рассчитай текущее действие, взведи таймер. По таймеру отрисуй результат на экране и рассчитай следующее действие и взведи таймер. Если надо передать ход человеку, то таймер не взводи. Во время работы таймера приложение сможет отвечать на внешние раздражители, в отличие от Sleep()


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 05, 2013, 22:04
Блин, со слипами уже всё работает, и теперь всё переделывать, таймер прикручивать?

Код
C++ (Qt)
//**********************************************************
// процесс игры
void Widget::proc_Game()
 
{
 
QMessageBox msgBox;
 
int X;
 
//change_Opacity(1);
//set_Action = 0;
 
 
//ход человека
X = Move_Homo(mouse_x, mouse_y);
 
 
//ход человека: ошибка
if (X == 2) {Beep(1000, 800); return;}
 
// пеперисовываем поле
FC->repaint();
 
ui->progressBar_Comp->setValue(Cx_Palube_Comp * 10);
 
 
 
//победа человека, конец игры
if(Cx_Palube_Comp == 10)
   {
   set_Action = 0;
 
   Sleep(800);
 
   msgBox.setText("Win HOMO");
   msgBox.exec();
 
   Sleep(800);
 
   change_Opacity(2);
 
   ui->pushButton_3->setDisabled(false);
   return;
   }
 
 
//ранен, убит - продолжение хода чела
if(X == 1) return;
 
 
 
   //QMessageBox msgBox;
   //msgBox.setText(QString::number(X));
   //msgBox.exec();
 
   //если комп уже выиграл, добиваем без пауз
   //if(Cx_Palube_Comp < 10) Sleep(1000);
 
 
 
 
// отдаём ход компьютеру
if(Cx_Palube_Homo < 10) X = 1;
 
Sleep(800);
change_Opacity(0);
Sleep(500);
 
 
 
   // победа компьютера, доигрывает человек
   //else X = 0;
 
 
//продолжение хода компьютера
while(X == 1)
   {
   X = Move_Comp();
 
   FH->repaint();
 
   ui->progressBar_Homo->setValue(Cx_Palube_Homo * 10);
 
   //msgBox.setText(QString::number(Cx_Palube_Homo));
   //msgBox.exec();
 
   Sleep(800);
 
   // победа компьютера, конец игры
   if(Cx_Palube_Homo == 10)
       {
       set_Action = 0;
 
       Sleep(800);
 
       msgBox.setText("Win COMP");
       msgBox.exec();
 
       Sleep(800);
 
       change_Opacity(2);
 
       ui->pushButton_3->setDisabled(false);
       return;
       }
   }
 
Sleep(800);
change_Opacity(1);
 
 
//переход хода к человеку
return;
}


Название: Re: Вторая форма в проекте.
Отправлено: mutineer от Июнь 05, 2013, 22:04
Ну можешь не переделывать и наслаждаться окнами, зависшими на несколько секунд
Но я бы не называл это "все работает"


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 05, 2013, 22:17
Окна не зависают. Просто если кликать мышкой чаще положенного - начинается путаница: компьютер походил, человек походил и уже непонятно кто, куда, чей счас ход, нада кликать или ждать, пока старые клики пройдут. Несолидно.


Название: Re: Вторая форма в проекте.
Отправлено: mutineer от Июнь 05, 2013, 22:19
Окна зависают, можешь проверить. Во время этих слипов они ни на что не реагируют. Ну и концептуально это тоже неправильно. Но вообще хозяин барин


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 05, 2013, 22:51
Ну по крайней мере они перерисовываются, если другим окном по ним ездить. Да не, я переделаю конечно, тока теперь надо в таймере разбираться.


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 06, 2013, 00:46
Фигня какая!!! Я рэндом из qrand() сваял:

Код
C++ (Qt)
int random(int x)
   {
   return qrand() % x;
   }

Я и слип из таймера и глобальной переменной замастырю. В переменную число нужное вставляем, например 8, а по слотам таймера каждые 100мс единичку вычитаем до нуля - получите 0,8 сек. И программу переделывать будет ненада... поменять только Sleep на Pauza


Название: Re: Вторая форма в проекте.
Отправлено: mutineer от Июнь 06, 2013, 08:25
А зачем 8 раз по 100мс? Почему не один раз на 800мс таймер завести?
В чем фишка с рандомом я вообще не понял... Так в любой доке написано


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 06, 2013, 13:32
У меня уже был морской бой на билдере написан, алгоритмы игры я взял оттуда. В билдере рэндом, в Qt куранд, чтобы не менять по всей программе я сделал рэндом из куранда.

С паузой сложнее. Я конечно могу аналог слипа сделать, но что-то мне подсказывает, что он будет точно так же тормозить комп - нужно в цикле ждать, прошло ли 0,8 сек.

Честно говоря я в затруднении. Сам принцип построения игрового процесса (простой и понятный со слипами) с таймером что-то пока не вырисовывается.

1. Программа ждёт клика мышкой по полю. Где имено и как она это делает - мне неизвестно.
2. Клик - вызывается mousePressEvent
3. mousePressEvent эмитирует сигнал, который связан со слотом игрового процесса. В зависимости от игровой ситуации либо ходит комп, либо return - и ждём следующего клика по полю (хода чела).

Теперь с таймером. mousePressEvent запускает таймер? Ну запустили - сам игровой процесс в onTimeout чтоли впихивать? Он же каждый период времени выскакивает... ну допустим я при первом включении таймер сразу остановлю. Пошла игра, дошла до первой необходимости сделать временную задержку - снова включать таймер? Так он и включит onTimeout сначала, а зачем мне сначала? Мне нужно с того места, где я паузу делал. С помощью глобальной переменной запоминать, с какого места начинать в очередной раз? Во геморой то блин!


Название: Re: Вторая форма в проекте.
Отправлено: mutineer от Июнь 06, 2013, 13:49
Нажал кнопку - рассчитал следующее действие, запомнил что сделать надо, запустил таймер, вышел из функции.
Пришел таймаут - выполнил текущее действие, рассчитал следующее, в очередь записал, запустил таймер, вышел из функции
Пришел таймаут - см. выше


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 06, 2013, 14:18
Что значит рассчитал - выполнил? Это если действия однотипные: рассчитал картинку на экране - сбросил в буфер, при следующем таймере вывел буфер на экран, и рассчитываешь следующую картинку. Это только для мультиков годится.


Название: Re: Вторая форма в проекте.
Отправлено: mutineer от Июнь 06, 2013, 14:19
не обязательно там должны быть однотипные действия. Но вообще делай как хочешь


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 06, 2013, 14:52
Да не в том дело, как хочешь, а как правильно? Я сделал уже как хочу и результат меня не устраивает. Хотя игра и заиграла, что уже неплохо.

Как  это необязательно однотипные действия, если раз за разом вызывается одна и та же функция таймера, и управление всегда передаётся в начало? Поэтому я и написал - в зависимости от игровой ситуации управление передавать в нужную точку (и эту точку хранить в памяти между вызовами таймера) - чтобы действия были неоднотипными. Ну в общем направление мыслей понятно, осталось реализовать.

Кстати, в билдере нет сигналов-слотов, я там строил игровой процесс таки в таймере. Но я вызывал его один раз, и весь ход проходил в нём, а паузы делал старыми добрыми слипами. Может поэтому там с выводом картинок проблемы были, какие-то пустые квадратики проскакивали время от времени - некрасиво.


Название: Re: Вторая форма в проекте.
Отправлено: mutineer от Июнь 06, 2013, 15:03
Что мешает запоминать тип действия и необходимые параметры, а в таймауте выполнять действие, соответствующее типу?


Название: Re: Вторая форма в проекте.
Отправлено: Igors от Июнь 06, 2013, 15:11
Да не в том дело, как хочешь, а как правильно?
Правильно придерживаться событийной схемы (event-driven), никакого геморроя там нет.  Да, запоминать текущее состояния, выполнять квант работы и снова ждать события. Это нормально, все так или иначе расстаются с "удобным" sleep'ом, не затягивайте


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 06, 2013, 15:18
Что мешает запоминать тип действия и необходимые параметры, а в таймауте выполнять действие, соответствующее типу?
:) я не умею в программе выполнять действия, я умею вызывать функции, которые выполняют разные действия.


Название: Re: Вторая форма в проекте.
Отправлено: mutineer от Июнь 06, 2013, 15:28
Что мешает запоминать тип действия и необходимые параметры, а в таймауте выполнять действие, соответствующее типу?
:) я не умею в программе выполнять действия, я умею вызывать функции, которые выполняют разные действия.

Код:
switch(actionType)
{
     case AI_TURN:
            doAiTurn();
            break;

     case HUMAN_TURN:
            doHumanTurn();
            break;

     case INDICATE_HIT:
            doIndicateHit();
            break;

     ...
}


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 06, 2013, 16:20
А это не одно и то же? Всё равно в результате разные функции вызываются.

У меня всё осложняется необходимостью преключения между игровыми полями - в морском бое (в отличие от примитивных шахмат) их целых два. И переключение не мгновенное - неактивное ещё и прозрачное на 0.8, и при переключении эта прозрачность "перетекает" из одного окна в другое - так красиво, и отказываться от этого я не собираюсь. Бум работать.



Название: Re: Вторая форма в проекте.
Отправлено: Kurles от Июнь 06, 2013, 16:47
Фигня какая!!! Я рэндом из qrand() сваял:

Код
C++ (Qt)
int random(int x)
   {
   return qrand() % x;
   }

Я и слип из таймера и глобальной переменной замастырю. В переменную число нужное вставляем, например 8, а по слотам таймера каждые 100мс единичку вычитаем до нуля - получите 0,8 сек. И программу переделывать будет ненада... поменять только Sleep на Pauza
если так уж хочется паузу в процедурах:
Код
C++ (Qt)
void pause(int ms)
{
   QEventLoop el;
   QTimer t;
   connect(&t, SIGNAL(timeout()), &el, SLOT(quit()));
   t.start(ms);
   el.exec();
}
Более-менее правильная Qt реализация.


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 06, 2013, 17:02
Wow! Спасибо огромное! Ща сразу и пропробуем...


Название: Re: Вторая форма в проекте.
Отправлено: mutineer от Июнь 06, 2013, 17:16
А это не одно и то же? Всё равно в результате разные функции вызываются.

Не одно и то же с чем? С твоими слипами не одно и то же


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 06, 2013, 18:31
pause рулит!!! Всё заработало!

Последний штрих остался. Нужно, чтобы по нажатию кнопки все три формы одновременно минимизировались на панель задач, и обратно - при клике на любой форме восстанавливались. Какие там сигналы они испускают при минимизации и восстановлении?


Название: Re: Вторая форма в проекте.
Отправлено: Igors от Июнь 06, 2013, 19:01
Какие там сигналы они испускают при минимизации и восстановлении?
Не привыкайте спрашивать на форуме не заглянув в доку - верный путь нарваться на неприятности


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 06, 2013, 21:08
Как туда заглянуть? Меня интересуют сигналы, которые генерирует форма в разных ситуациях.


Название: Re: Вторая форма в проекте.
Отправлено: kambala от Июнь 06, 2013, 21:16
сигналы никакие не испускаются, вызываются события. открываешь QEvent и читаешь какие есть события, нужные перехватываешь.


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 09, 2013, 09:52
Примерчик можете привести, где события вызываются и перехватываются? Или ссылку на пример, а то чего то не очень понятно...


Название: Re: Вторая форма в проекте.
Отправлено: kambala от Июнь 09, 2013, 11:15
Код
C++ (Qt)
protected:
   void changeEvent(QEvent *e)
   {
       if (e->type() == QEvent::WindowStateChange)
       {
           qDebug("window state changed: %d", windowState());
           if (isMinimized())
               qDebug("minimized");
           if (isMaximized())
               qDebug("maximized");
           if (isFullScreen())
               qDebug("fullscreen");
 
           Qt::WindowStates oldState = static_cast<QWindowStateChangeEvent *>(e)->oldState();
           if (oldState & Qt::WindowMinimized || (oldState & Qt::WindowMaximized && windowState() == Qt::WindowNoState))
               qDebug("restored");
       }
       QWidget::changeEvent(e);
   }


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 09, 2013, 14:28
Куда это вставлять? В конструктор формы? В заголовочный файл писать что-нибудь надо? Библиотеки подключать?


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 12, 2013, 12:51
Чтобы 3 формы на экране расположились "правильно", я в конструктор написал вот так:

Код
C++ (Qt)
//положение форм на экране
this->setGeometry(200,480,535,110);
 
FH->setGeometry(200,200,251,251);
FC->setGeometry(480,185,251,251);

но это привело к тому, что формы теперь не хотят мышкой перемещаться по экрану - стоят на своих местах как вкопанные. Это можно как-то исправить?

И дальше - мне желательно, чтобы при перемещении главного окна, вспомогательные его сопровождали. Какое событие вызывается, когда юзер перемещает форму мышкой?


Название: Re: Вторая форма в проекте.
Отправлено: mutineer от Июнь 12, 2013, 12:58
Почему ты не хочешь читать документацию?
http://doc.qt.digia.com/4.7/qwidget.html#moveEvent


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 12, 2013, 13:32
Почему ты не хочешь читать документацию?
http://doc.qt.digia.com/4.7/qwidget.html#moveEvent
Для того, чтобы произошло moveEvent, мне надо как-то сдвинуть их с места.


Название: Re: Вторая форма в проекте.
Отправлено: mutineer от Июнь 12, 2013, 14:31
Это был ответ на твой второй вопрос


Название: Re: Вторая форма в проекте.
Отправлено: Alexu007 от Июнь 13, 2013, 13:54
Как в программе воспроизвести системные звуки?


Название: Re: Вторая форма в проекте.
Отправлено: mutineer от Июнь 13, 2013, 13:55
Как в программе воспроизвести системные звуки?

Если этот вопрос не влияет на вторую форму в проекте, то советую создать новую тему, поможет потом при поиске