Вопрос № 145972: Здравствуйте, уважаемые эксперты. Как описать в C++ класс графических объектов-кнопок(которых должно быть 6 на экране) при щелчке на одной из них вызывается функция с параметром разным для каждой кнопки? Ну и чтобы надписи на них были разными. Также ...Вопрос № 145975: Здравствуйте, помогите пожалуста решить след. задачи и отладить или решить заново задачу в приложении: 4. Вроде всё правильно, но глючит. см. приложение.
5. Задана матрица A(n,m), упорядоченная по возрастанию построкам и столбцам, то есть A...
Вопрос № 145.972
Здравствуйте, уважаемые эксперты. Как описать в C++ класс графических объектов-кнопок(которых должно быть 6 на экране) при щелчке на одной из них вызывается функция с параметром разным для каждой кнопки? Ну и чтобы надписи на них были разными. Также нужен еще один большой графический элемент, на котором бы изменялся текст в ходе работы программы, размеры его должны автоматически подгоняться под размеры ее окна.Соотвественно и объем бы текста выведенного на нем должен подстраиваться под размер. Я очень просил
бы написать примерный код размещающий все это хозяйство на экране, поскольку в области графики не очень силен и имел опыт работы в основном с консольными приложениях. Спасибо.
Отправлен: 04.10.2008, 15:16
Вопрос задал: Alexg (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Dr_Andrew
Здравствуйте, Alexg! К сожалению, в своём вопросе Вы не указали операционную систему, под которой работаете, и предпочитаемую среду разработки. Поэтому привожу решение для Linux (пример №1 в приложении), компилятор g++ 4.1, библиотека Qt 3.3.8 (впрочем, под Windows пример №1 можно откомпилировать с использованием MS Visual C++ 6 и библиотеки Qt 3.2.1) и для Windows (пример №2 в приложении), среда разработки Borland C++ Builder или Turbo C++ Explorer. Разберём Вашу задачу на следующем примере. Предположим,
что у нас есть 6 кнопок класса TButton с открытым (public) свойством уникального идентификатора - тега (Tag). При нажатии на ту или иную кнопку выводится сообщение с номером её тега. Кроме того, это сообщение дублируется на ярлыке (label), находящемся под группой кнопок, расположенных в 3 колонках в 2 ряда. Размер ярлыка автоматически подстраивается под размеры текста. Пример 1. Объявим класс TButton, унаследовав его от Qt-класса QPushButton. В качестве открытого
свойства класса объявим строковую переменную QString sTag; Объявим также слот, который будет вызываться при щелчке на кнопке - void ClickedSlot(); Кроме того, объявим сигнал, который будет посылать тег кнопки, при щелчке на ней: void clicked(QString&); В реализации класса установим соединение между щелчком по кнопке и вызовом слота ClickedSlot(): connect(this, SIGNAL(clicked()), this, SLOT(ClickedSlot())); Слот будет генерировать сигнал, посылающий тег кнопки: emit clicked(sTag); В классе центрального
виджета TCentralWidget разместим виджеты кнопок (класс TButton) и ялыка для вывода текста (QLabel* pTextLabel) с помощью менеджеров компоновки (layouts), которые обеспечивают аккуратное размещение виджетов на форме приложения, а также подстраивание их размеров под размеры текста. Логика приложения реализована в слоте ButtonClickedSlot(QString&) центрального виджета, в который в качестве параметра передаётся тег вызвавшей кнопки:
Код:
void TCentralWidget::ButtonClickedSlot(QString& sTag) { QString sMessage = trUtf8("Нажата кнопка номер ") + sTag; QMessageBox::information(this, "Buttons", sMessage); // Сообщение с тегом кнопки
sMessage = "<p align=Center>" + trUtf8("Последней была
нажата кнопка номер ") + sTag + "</p>"; pTextLabel->setText(sMessage); // Сообщение на ярлыке }
Пример 2. Установим свойство Caption сгенерированной формы приложения в "Кнопки", а Name - в MainForm. Разместим на форме 6 кнопок класса TButton в 3 колонках в 2 ряда. Поскольку в Borland C++ Builder / Turbo C++ Explorer не имеет менеджеров компоновки, то кнопки придётся выравнивать на форме по линиям сетки
вручную, либо воспользовавшись командой контекстного меню Align... Внизу разместим ярлык класса TLabel. Установим свойство Caption ярлыка в "Нажмите кнопку", AutoSize и WordWrap в true, что обеспечит подстраивание размера ярлыка под размер текста. Класс TButton Билдера уже содержит свойство Tag, являющееся целочисленной переменной. Установим свойство Tag первой кнопки в 1, второй - в 2 и т.п. Логику приложения реализуем в обработчике события щелчка по первой кнопке:
Код:
void __fastcall TMainForm::Button1Click(TObject *Sender) { TButton* pButton = (TButton*)Sender; AnsiString sTag = IntToStr(pButton->Tag); // Преобразуем целочисленную переменную в строку AnsiString sMessage = "Нажата кнопка номер &quo
t; + sTag; ShowMessage(sMessage); // Сообщение с тегом кнопки sMessage = "Последней была нажата кнопка номер " + sTag; TextLabel->Caption = sMessage; // Сообщение на ярлыке }
В качестве аргумента обработчик события принимает компонент, вызвавший событие - щелчок по кнопке: TObject *Sender Объявим переменную-указатель на объект класса TButton и присвоим ему адрес объекта, вызвавшего щелчок по кнопке: TButton* pButton = (TButton*)Sender; После чего
мы можем в функции-обработчике вызывать то или иное действие в зависимости от тега кнопки. Для того, чтобы обработчик Button1Click вызывался при щелчке по любой кнопке, установим Events для каждой из 6 кнопок по событию OnClick в Button1Click. P.S. Также группу кнопок можно было реализовать в виде массива указателей на объекты, что разумно в случае их большого количества.
Приложение:
Ответ отправил: Dr_Andrew (статус: Студент)
Ответ отправлен: 05.10.2008, 10:23 Оценка за ответ: 5 Комментарий оценки: Спасибо за столь оперативный и полный ответ!
Вопрос № 145.975
Здравствуйте, помогите пожалуста решить след. задачи и отладить или решить заново задачу в приложении: 4. Вроде всё правильно, но глючит. см. приложение. 5. Задана матрица A(n,m), упорядоченная по возрастанию построкам и столбцам, то есть A(i,1)<=A(i,2)<=...<=A(i,m), для любого i A(1,j)<=A(2,j)<=...<=A(n,j), для любого j 6. Даны 2 целочисл. таблицы A(10) и B(15). Разработать алгоритм и написать программу, которая проверяет, являются ли эти таблицы похожими. 2 таблицы будем
называть похожими, если совпадают множества чисел, встречающихся в этих таблицах. PS: все задачи на тему "Сложность и эффективность алгоритмов. Поиск и сортировка информации", нумеровка как в списке задач.
Приложение:
Отправлен: 04.10.2008, 15:36
Вопрос задал: Piotr-1 (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 6)
Отвечает: Владимир (C4tnt)
Здравствуйте, Piotr-1!
4. Если у вас список монет сортированый - то ищите эталон двоичным или троичным поиском, более быстрый алгоритм довольно сложно придумать. А на несортированные списки быстрый поиск вообще не распространяется - ищите перебором.
5. Вопрос так и не задали...
6. Если таблицы не сортированы - берём первое число в B, удаляем из B все его вхождения, удаляем из A все его вхождения, если из А ничего удалено не было - значит списки не похожи. Если B пустой, а A - нет, значит
списки не похожи.
--------- Теперь к нашим ответам осталось лишь найти вопросы
Ответ отправил: Владимир (C4tnt) (статус: 5-ый класс)
Ответ отправлен: 04.10.2008, 20:24 Оценка за ответ: 4 Комментарий оценки: за 6 вопрос спасибо. Насчет зад. 4 и 5 см. минифорум - дополнения к условию. ЗЫ: 4-я задача не такая простая - опять же, в минифоруме.