![]() |
|
![]() ![]() ![]() |
|
andrew1ee |
|
||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 6.5.2014 Репутация: нет Всего: нет |
Добрый день!
Есть задание: реализовать "аналог драйвера принтера" используя класс QQueue. Т.е. есть окно, нажимаем кнопку "Открыть", выбираем файлы, файлы попадают в очередь, якобы для печати. Далее нажимаем "печать", файлы удаляются по очереди, якобы идет печать. Проблема в реализации, файлы вроде попадают в очередь, но не удаляются.
|
||||
|
|||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Это
делает копию списка строк и сохраняет эту копию в модели. А это удаляет элемент из очереди, которая уже никаким образом не связана с моделью и listView -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
andrew1ee |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 6.5.2014 Репутация: нет Всего: нет |
Ок. Подскажите как мне связать созданную очередь с listView , чтоб она отображалась на экране списком? И далее при нажатии кнопки "Print" очередь удалялась.
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
По большому счёту, queue тебе не нужен. Работай с QStringListModel. Используй QStringListModel::removeRows для удаления строк. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
andrew1ee |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 6.5.2014 Репутация: нет Всего: нет |
Я это знаю. Но мне стоит задание реализовать это именно используя класс QQueue.
|
|||
|
||||
andrew1ee |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 6.5.2014 Репутация: нет Всего: нет |
Возможно, есть смысл реализовать описанный функционал не используя listView. Но главное использовать QQueue. Есть какие-либо идеи?
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Вероятно, ТС не правльно понял смысл задания.
Как я понял, нужно что-то типа
так чтобы потом PrinterDriver можно было заменить на реальный драйвер, ничего не меняя в остальной части программы (кроме того, чтобы убрать элементы управления имитирующие печать файла) Это сообщение отредактировал(а) math64 - 9.5.2014, 07:29 |
|||
|
||||
andrew1ee |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 6.5.2014 Репутация: нет Всего: нет |
Если честно, многих вещей не понял.
1. Где объявлять конструктор и деструктор? 2. Их реализация так-же должна быть в заголовочном файле? 3. Тогда в файле .cpp будет только реализация функций кнопок? 4. Почему 2 раза объявлен "PrinterDriver* driver;" и т.д. Если можно объясните более подробно. P.S. cильно не пинайте, я только учусь. |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
PrinterDriver - эмулятор драйвера, который может быть заменён реальным драйвером.
queue - содержит файлы, стоящие в очереди на печать. Возможно, вместо QFile следует использовать структуру типа
Для эмуляции печати страницы можно задействовать QTimer (в секунду печатается одна страница) addFile, cancelPrint и т.д. вероятно, будут public slots, которые будут соединены с кнопками. filePrinted, pagePrinted и т.д. - сигналы, посылаемые по таймеру, или в вышеупомянутых слотах, которые должна слушать PrintDriverListModel. PrintDriverListModel может хранить данные в QStringList (в этом случае она должна поддерживать синхронизацию с очередью из PrintDriver или иметь доступ непосредственно к очереди Примеры как реализовать свою модель списка, можно найти в примерах Qt. PrinterDriver* driver объявлен два раза, потому что доступ к нему потребуется как в главном окне, так и в модели списка. они указывают на один и тот же объект, который должен создаваться и удаляться в главном окне, а в модель списка передаваться в конструкторе. |
|||
|
||||
andrew1ee |
|
||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 6.5.2014 Репутация: нет Всего: нет |
math64, сделал что смог. Подозреваю что куча ошибок. Не компилируется. Если можно посмотрите и поправьте что не так. Выкладываю и .h и .cpp
|
||||
|
|||||
math64 |
|
||||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
1. В PrintDriver первая строка после { - Q_OBJECT, как в MainWindow.
2. Я в своем примере тела методов приводил для краткости в заголовке. Их лучше вынести в .cpp файл 3. Классы лучше размещать в отдельных файлах 4. QStringListModel* model не нужна. Нужна только PrinterDriverListModel, которую можно унаследовать от QStringListModel. 5. Перед объявлением слотов нужно писать public slots: Слоты нужно объявлять в нужном классе (selectionChanged в классе MainWindow) Для сигналов тело не пишется В конструкторе нужно сделать нужные connect ... В обработчике кнопки (дизайнер назовет его on_actionAddFile_triggered() ) нужно открыть QFileOpenDialog (как у тебя сделано), но дальше для каждого выбранного файла нужно создать структуру QPrintFile и вызвать
драйвер должен добавить эту структуру в очередь и вызвать
PrintDriverListModel должна подписаться на этот сигнал и в его обработчике добавить файл в свой список. Если используется таймер, его нужно запустить когда в очереди появляются файлы и остановить когда все файлы напечатаны. В обработчике таймера (или кнопки имитирующей печать страницы) увеличивается на 1 поле printedPages первой структуры в очереди и вызывается
Если все страницы напечатаны, вызывается
а файл удаляется из очереди. PrintDriverListModel должна слушать эти сигналы и соответственно изменять свой список. В обработчике снятия с печати определяются выделенные в списке файлы (следить за изменением выделения не обязательно - его можно всегда получить у списка) и для каждого выделенного файла вызывается
драйвер вызывает
и удаляет его из очереди PrintDriverListModel слушает этот сигнал и удаляет файл из своего списка Это сообщение отредактировал(а) math64 - 12.5.2014, 17:29 |
||||||||||||
|
|||||||||||||
andrew1ee |
|
||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 6.5.2014 Репутация: нет Всего: нет |
Получилось как-то так. Но есть ошибки. Классы пока для удобства оставил в одном файле
|
||||
|
|||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
я же всё подробно расписал в предыдущем сообщении в каких классах что делать. ты же всё делаешь в MainWindow.
Наприер, это должно быть в коде драйвера:
а это в коде модели:
Примеры как писать модель можно найти в каталогах expamples и demo, например examples\itemviews\puzzle\piecesmodel.cpp Это сообщение отредактировал(а) math64 - 13.5.2014, 21:56 |
||||
|
|||||
andrew1ee |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 6.5.2014 Репутация: нет Всего: нет |
И что мне тогда оставлять в слотах on_addFiles_clicked(); on_print_clicked(); on_cancel_clicked()?
Где найти эти примеры? PS: поймите, что если бы я все знал, я бы сюда не пришел с вопросами. Это сообщение отредактировал(а) andrew1ee - 13.5.2014, 22:29 |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
аналогично для других |
|||
|
||||
andrew1ee |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 6.5.2014 Репутация: нет Всего: нет |
Понимаю что вызову бурю негодования. Но прошу помощи. Все сроки закончились а программа не готова. Зашел в тупик.
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
У тебя проблемы с C++. Прежде чем писать для Qt следовало бы выучить C++.
Конструктор не возвращет никакого значения, даже void. У класса не может быть нескольких конструкторов с одной и той же сигнатурой - их нужно объединить в один. У класса, производного от абстрактного (QAbstractListModel) нужно реализоваывать все абстрактные методы - компилятор выдаст соответсвующие сообщения об ошибке. Примеры реализации класса, производного от QAbstractListModel и др. есть вместе с Qt - ищи QAbstractListModel в файлах .cpp и .h в каталогах examples и demo Добавлено через 2 минуты и 43 секунды Если нужен доступ к объекту, созданному в конструкторе, запомни его в поле класса, а не создавай каждый раз новый экземпляр:
Добавлено через 5 минут и 34 секунды Из PrintDriverListModel нет доступа к полям MainWindоw - список file должен быть полем в PrintDriverListModel |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |