![]() |
|
![]() ![]() ![]() |
|
olegg95 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.10.2012 Репутация: нет Всего: нет |
Решил реализовать поле для крестиков-ноликов в Qt. Делаю его при помощи кнопок. Крестики и нолики будут отображаться символами(буковка o или x). Поле игры, состоящее из кнопок создал при помощи дизайнера (3 на 3). Назвал кнопки: kletka1, kletka2….. .
Кнопки будут только отображать состояние элементов двумерного массива объектов класса Kletka, созданного мной в конструкторе главной формы. Класс Kletka содержит поля: int value(0-пустая клетка, 1-нолик, 2-крестик ) и QPushButton * p – указатель кнопку, соответствующую данной клетке игрового поля. Для изменения состояния соответствующей кнопки(вместе с изменением значения поля value) пытаюсь использовать соответствующие слоты void Set_value() и void Set_Button_value(), созданные мной внутри класса Kletka. А теперь проблема! При попытке вызвать какой-либо слот для элемента массива клеток начинаются всякие ошибки и ничего не получается. Подскажите пожалуйста, как решить проблему и как правильно использовать слоты элементов собственных классов? mainwindow.h
mainwindow.cpp
Помогите пожалуйста! Очень нужно разобраться с этим для написания курсовой. Это сообщение отредактировал(а) olegg95 - 3.5.2013, 20:28 |
||||
|
|||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Слоты должны быть в секции public slots: или private slots:
У тебя Set_value() и Set_Button_value() не слоты, а обычные методы. Добавлено через 4 минуты и 58 секунд 2. Kletka k[3][3] создается на стеке. После выхода из конструктора эти объекты будут автоматически уничтожены. Нужно поле Kletka* m_kletka[3][3]; в MainWindow. В конструкторе в цикле нужно создавать клетки по new. Удалять в деструкторе или задать родителем клеток главное окно. |
|||
|
||||
olegg95 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.10.2012 Репутация: нет Всего: нет |
Спасибо! Но я не могу создавать клетки по new в конструкторе, потому что для их создания я использую дизайнер форм. Как тогда?
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Вызывашь setupUi() а после него досоздаёшь то, что не можешь создать дизайнером. Можно даже удалять объекты созданные дизайнером. Я, например, часто удаляю центральный виджет и заменяю на свой, добавляю комбо-боксы в панель инструментов - дизайнер позволяет добавлять только действия, панели в строку состояния - дизайнер туда ничего не позволяет добавлять, добавляю док-панели - их удобнее создавать в отдельном классе, а дизайнер не позволяет группировать их в закладки, созадю таймеры, модели для таблиц и т.д. Необходимые поля добавляются в секцию private обычно в конце объявления MainWindow в mainwindow.h вручную.
|
|||
|
||||
olegg95 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.10.2012 Репутация: нет Всего: нет |
Странно. Но при попытке создать хоть какой-нибудь слот внутри собственного класса выдаёт ошибки:
Присоединённый файл ( Кол-во скачиваний: 1 ) ![]() |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Нужен макрос Q_OBJECT сразу после { в новой строке.
Добавлено через 54 секунды И наследование от QObject/ |
|||
|
||||
olegg95 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.10.2012 Репутация: нет Всего: нет |
Объясните пожалуйста, где именно setupUi() вызвать нужно, если я элементы класса Kletka в массиве создаю?
Кнопкам, написанным вручную, изменять параметры и позиционировать сложно очень. Может удобней будет вместо Kletka[i][j]=new Kletka, присвоить каждому элементу p(Указатель на QPushButton) маассива вручную соответствующую кнопку, построенную с помощью дизайнера? Как вы считаете? Я вообще, честно говоря, не понимаю как с такими кнопками работать. Каждой из них координаты расположения отдельно задавать что ли? Это сообщение отредактировал(а) olegg95 - 5.5.2013, 15:45 |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Почти как ты делал, но создаёшь не на стеке, а в поле класса:
|
|||
|
||||
olegg95 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.10.2012 Репутация: нет Всего: нет |
m_kletka[0][0] = new Kletka(this, 0, 0, ui->kletka1);
Я так понял, this делает элемнт наследником главной формы, ui->kletka1 - указывается кнопка на главной форме которая должна принять роль этой самой new Kletka. Объясните пожалуйста, что означает второй и третий параметр в скобках. ошибка: C2661: Kletka::Kletka: нет перегруженной функции, принимающей 4 аргумента Что я не правильно сделал? |
|||
|
||||
al0 |
|
|||
Unregistered |
В дизайнере кликаете правой кнопкой мыши на кнопку вашей клетки. В открывшемся списке выбираете "Перейти к слоту..." Откроется список выбора слота. Выбираете нужный - clicked(), clicked(bool) или другой и получаете рабочий код.
Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
al0 - не получится так. Во время дизайна нет объектов Kletka. Правда, можно унаследовать класс Kletka от QButton.
Olegg95 - я полагаю, Kletka должна знать свои координаты и их можно передать в конструктор. Также там передаётся QButton, с которой нужно сделать connect. |
|||
|
||||
olegg95 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.10.2012 Репутация: нет Всего: нет |
Это всё в конструкторе сделать да?
А как указать сигнал, генерирующийся при изменении текста кнопки? |
|||
|
||||
Jeka178RUS |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 3.9.2012 Репутация: нет Всего: нет |
Создается впечатление что Вам сначала стоит как следует почитать про систему сигналов и слотов, так вопросы озвучиваемые Вами мягко говоря глупые.
Для подачи сигнала используется emit для соединение сигнала со слотом connect http://habrahabr.ru/post/50812/ http://www.developer.nokia.com/Community/W...D0%B2_%D0%B2_Qt Так например QPushButton не имеет сигнала о изменении текста (что логично, текст кнопки не её целевая функция), а вот QLineEdit как раз имеет. Если Вы хотите научить кнопку сообщать о изменении текста на ней, то вам необходимо наследоваться и реализовывать этот функционал самостоятельно, однако выглядеть это будет странно. Куда проще и логичнее наследоваться от QWidget и переопределив paintEvent и mouseClickevent реализовать игровое поле. А таком случае зная положение курсора в момент нажатия мыши легко определить на какой "клетке" (зная размеры игрового поля и размеры игровой сетки) был клик. Хранить внутри матрицу значений для игровой сетки и используя эти данные рисовать необходимые символы в paintEvent. Это сообщение отредактировал(а) Jeka178RUS - 6.5.2013, 15:31 |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
На самом деле проще использовать таблицу - у неё всё нужное уже есть, нужно реализовать модель таблицы.
Для отрисовки ячейки таблицы можно использовать делегат, но в данном случае можно всё реализовать в модели, там есть большое разнообразие ролей. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |