Russian Qt Forum
Октябрь 02, 2024, 19:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4 5 6   Вниз
  Печать  
Автор Тема: Вторая форма в проекте.  (Прочитано 30357 раз)
Alexu007
Гость
« Ответ #30 : Май 24, 2013, 17:41 »

Sleep() под виндой. научись хоть гуглом пользоваться.

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


но так не заработало, написало что QThread::msleep() протектед. Но когда я кликнул на ошибку, у меня открылся до этого невидимый мне файл, в котором как раз и protected: QThread::msleep(). Тогда я перенёс ету строчку в в public: и заработало! Что я наделал? Я сломал Qt?
Записан
mutineer
Гость
« Ответ #31 : Май 24, 2013, 17:43 »

Камбала говорил тебе о том, что под вендами Sleep с большой буквы пишется
« Последнее редактирование: Май 24, 2013, 17:45 от mutineer » Записан
Majestio
Гость
« Ответ #32 : Май 24, 2013, 17:44 »

Тогда я перенёс ету строчку в в public: и заработало! Что я наделал? Я сломал Qt?
Ты чуть не удалил интернет!  Крутой
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #33 : Май 24, 2013, 17:46 »

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

Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Alexu007
Гость
« Ответ #34 : Май 24, 2013, 17:59 »

Наконец то дошло про Sleep с большой буквы. Спасибо. Туповат я немного... А как теперь библиотеку назад починить?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #35 : Май 24, 2013, 20:05 »

вернуть метод назад в секцию protected очевидно
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Alexu007
Гость
« Ответ #36 : Май 24, 2013, 20:23 »

вернуть метод назад в секцию protected очевидно
Да эт понятно, но как эту библиотеку на экран вернуть? Ошибки больше нет, Qt её не показывает...

А вообще удивительно, что Qt так легко позволяет библиотеки редактировать ломать всяким начинающим. Хоть бы предупредил.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #37 : Май 24, 2013, 20:40 »

Qt4\include\QtCore\qthread.h или Qt5\qtbase\include\QtCore\qthread.h

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Alexu007
Гость
« Ответ #38 : Июнь 05, 2013, 14:50 »

Получается примерно такая прога - игра Морской Бой. На картинке раненые, убитые и целые корабли. Пара вопросов:

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

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

Сообщений: 4744



Просмотр профиля WWW
« Ответ #39 : Июнь 05, 2013, 16:52 »

1. QWidget::activateWindow() и/или QWidget::raise()
2. disconnect()
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Alexu007
Гость
« Ответ #40 : Июнь 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 и осуществляется ход человека.

« Последнее редактирование: Июнь 05, 2013, 19:42 от Alexu007 » Записан
mutineer
Гость
« Ответ #41 : Июнь 05, 2013, 19:47 »

слот, подписанный на processGame() работает в главном потоке приложения? Если да, то никто не ждет пока set_Action станет равным 2, события просто ждут своей очереди пока слот не закончит выполнение
Записан
Alexu007
Гость
« Ответ #42 : Июнь 05, 2013, 20:18 »

Да, у меня только один поток. Но в set_Action я ставлю двойку, только когда нужно отдать ход человеку. А в остальное время там 0, который прописывается в самом обработчике событий мышки. Поэтому при "лишних" кликах я ожидаю звуковой сигнал и выход из обработчика без каких-либо действий по строчке:

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

Но этого не происходит. Нигде в программе в set_Action ошибочно двойки не записываются, я поиском проверял.
Записан
Alexu007
Гость
« Ответ #43 : Июнь 05, 2013, 20:28 »

Блин, дошло почему. Управление из processGame обратно в обработчик мыши возвращается, и новый клик не обрабатывается, пока старый не обработан. Вот они и ждут где-то в очереди.

А чё делать? А если не processGame вызвать, а таймер, а из таймера уже processGame - управление всё равно в обработчик мыши вернётся?
Записан
mutineer
Гость
« Ответ #44 : Июнь 05, 2013, 20:43 »

processGame долго выполняется? Кстати, если это просто метод, то зачем возле него emit? Сбивает с толку
Записан
Страниц: 1 2 [3] 4 5 6   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.139 секунд. Запросов: 23.