Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Аналог драйвера принтера, используя класс QQueue 
:(
    Опции темы
andrew1ee
Дата 6.5.2014, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 6.5.2014

Репутация: нет
Всего: нет



Добрый день! 
Есть задание: реализовать "аналог драйвера принтера" используя класс QQueue. Т.е. есть окно, нажимаем кнопку "Открыть", выбираем файлы, файлы попадают в очередь, якобы для печати. Далее нажимаем "печать", файлы удаляются по очереди, якобы идет печать. 
Проблема в реализации, файлы вроде попадают в очередь, но не удаляются. 


Код

#ifndef DRIVER_H
#define DRIVER_H

#include <QMainWindow>
#include <QStringListModel>
#include <QQueue>
#include <QItemSelectionModel>

namespace Ui {
class Driver;
}

class Driver : public QMainWindow
{
    Q_OBJECT

private slots:
    void on_open_clicked();
    void on_print_clicked();
    void on_cancel_clicked();

public:
    explicit Driver(QWidget *parent = 0);
    ~Driver();

private:
    Ui::Driver *ui;
    QStringList fileList;
    QStringListModel *model;
    QQueue <QStringList> queue;
};

#endif // DRIVER_H


Код

#include "driver.h"
#include "ui_driver.h"
#include <QFileDialog>
#include <QQueue>
#include <QStringListModel>
#include <QModelIndex>
#include <QAction>
#include <QItemSelection>


Driver::Driver(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Driver)
{
    ui->setupUi(this);
    model = new QStringListModel();
    ui->listView->setModel(model);

}

Driver::~Driver()
{
    delete ui;
}

void Driver::on_open_clicked()
{
    fileList = QFileDialog::getOpenFileNames(this, tr("Открыть файл для печати"), "D://",  tr("Office (*.doc *.docx)"));
    queue.enqueue(fileList);
    model->setStringList(fileList);

}

void Driver::on_print_clicked()
{
    queue.pop_front();
}

void Driver::on_cancel_clicked()
{
    close();
}




PM MAIL   Вверх
borisbn
Дата 6.5.2014, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Это
Цитата(andrew1ee @  6.5.2014,  17:45 Найти цитируемый пост)
model->setStringList(fileList);

делает копию списка строк и сохраняет эту копию в модели. А это
Цитата(andrew1ee @  6.5.2014,  17:45 Найти цитируемый пост)
queue.pop_front();

удаляет элемент из очереди, которая уже никаким образом не связана с моделью и listView


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
andrew1ee
Дата 6.5.2014, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 6.5.2014

Репутация: нет
Всего: нет



Ок. Подскажите как мне связать созданную очередь с listView , чтоб она отображалась на экране списком? И далее при нажатии кнопки "Print" очередь удалялась.
PM MAIL   Вверх
borisbn
Дата 7.5.2014, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(andrew1ee @  6.5.2014,  20:15 Найти цитируемый пост)
 как мне связать созданную очередь с listView

По большому счёту, queue тебе не нужен. Работай с QStringListModel.
Используй QStringListModel::removeRows для удаления строк.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
andrew1ee
Дата 7.5.2014, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 6.5.2014

Репутация: нет
Всего: нет



Я это знаю. Но мне стоит задание реализовать это именно используя класс QQueue.
PM MAIL   Вверх
andrew1ee
Дата 8.5.2014, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 6.5.2014

Репутация: нет
Всего: нет



Возможно, есть смысл реализовать описанный функционал не используя listView. Но главное использовать QQueue. Есть какие-либо идеи?
PM MAIL   Вверх
math64
Дата 9.5.2014, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Вероятно, ТС не правльно понял смысл задания.
Как я понял, нужно что-то типа
Код

class PrinterDriver : public QObject {
...
public:
   void addFile(const QFile&);
   void cancelPrint(const QFile&);
   ...
signals:
   void filePrinted(const QFile&);
   ...
private:
  QQueue<QFile> queue;
};

class PrinterDiriverListModel : public QAbstractListModel {
...
private:
   PrinterDriver* driver;
};

class MainWindow : public QMainWindow {
   ...
public:
  MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ...  {
     ...
     driver = new PrinterDriver();
     ui->listView->setModel(new PrinterDriverListModel(driver));
     ...
  }
  ...
private:
  PrinterDriver* driver;
};

так чтобы потом PrinterDriver можно было заменить на реальный драйвер, ничего не меняя в остальной части программы (кроме того, чтобы убрать элементы управления имитирующие печать файла)

Это сообщение отредактировал(а) math64 - 9.5.2014, 07:29
PM   Вверх
andrew1ee
Дата 11.5.2014, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 6.5.2014

Репутация: нет
Всего: нет



Если честно, многих вещей не понял.
1. Где объявлять конструктор и деструктор? 
2. Их реализация так-же должна быть в заголовочном файле?
3. Тогда в файле .cpp будет только реализация функций кнопок?
4. Почему 2 раза объявлен "PrinterDriver* driver;" и т.д.

Если можно объясните более подробно.
P.S. cильно не пинайте, я только учусь. 

PM MAIL   Вверх
math64
Дата 11.5.2014, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



PrinterDriver - эмулятор драйвера, который может быть заменён реальным драйвером.
queue - содержит файлы, стоящие в очереди на печать.
Возможно, вместо QFile следует использовать структуру типа
Код

struct QPrintFile {
QString fileName; // Имя файла
int totalPages; // Всего страниц в файле - для эмулятора можно считать размер файла/ 1Kбайт
int printedPages; // Число напечатанных страниц 
};

Для эмуляции печати страницы можно задействовать QTimer (в секунду печатается одна  страница)
addFile, cancelPrint и т.д. вероятно, будут public slots, которые будут соединены с кнопками.
filePrinted, pagePrinted и т.д. - сигналы, посылаемые по таймеру, или в вышеупомянутых слотах, которые должна слушать PrintDriverListModel.
PrintDriverListModel может хранить данные в QStringList (в этом случае она должна поддерживать синхронизацию с очередью из PrintDriver или иметь доступ непосредственно к очереди
Примеры как реализовать свою модель списка, можно найти в примерах Qt.
PrinterDriver* driver объявлен два раза, потому что доступ к нему потребуется как в главном окне, так и в модели списка. они указывают на один и тот же объект, который должен создаваться и удаляться в главном окне, а в модель списка передаваться в конструкторе.

PM   Вверх
andrew1ee
Дата 12.5.2014, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 6.5.2014

Репутация: нет
Всего: нет



math64, сделал что смог. Подозреваю что куча ошибок. Не компилируется. Если можно посмотрите и поправьте что не так. Выкладываю и .h и .cpp

Код

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QAbstractListModel>
#include <QFile>
#include <QQueue>
#include <QStringListModel>
#include "ui_mainwindow.h"

namespace Ui {
class MainWindow;
}

struct QPrintFile
{
    QString fileName; // Имя файла
    int totalPages; // Всего страниц в файле
    int printedPages; // Число напечатанных страниц
};

class PrinterDriver : public QObject
{
public:
    void addFile(const QPrintFile&);
    void cancelPrint(const QPrintFile&);
    void selectionChangedSlot(const QItemSelection & newSelection, const QItemSelection & oldSelection);

signals:
    void filePrinted(const QPrintFile&);
    void pagePrinted(const QPrintFile&);

private:
    QQueue<QPrintFile> queue;
};

class PrinterDriverListModel : public QAbstractListModel
{

private:
    PrinterDriver *driver;
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:

    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        driver = new PrinterDriver();
        ui->listView->setModel(new PrinterDriverListModel(driver));
        fileList = new QStringList();
        model = new QStringListModel();
        ui->listView->setModel(model);

        selectionModel = ui->listView->selectionModel();
        connect(selectionModel, SIGNAL(selectionChanged(const QItemSelection &,const QItemSelection &)),
                this, SLOT(selectionChangedSlot(const QItemSelection &, const QItemSelection &)));
    }

    MainWindow::~MainWindow()
    {
        delete ui;
        delete driver;
    }

private:
    Ui::MainWindow *ui;
    PrinterDriver *driver;
    QStringList fileList;
    QStringListModel *model;
    QItemSelectionModel *selectionModel;
    QModelIndex currentIndex, selectedIndex;
};

#endif // MAINWINDOW_H



Код

#include "mainwindow.h"
#include "ui_mainwindow.h"

void MainWindow::addFile(const QPrintFile&)
{
    fileList = QFileDialog::getOpenFileNames(this, tr("Открыть файл для печати"), "D://",  tr("Office (*.doc *.docx)"));
    model->setStringList(fileList);
    currentIndex = model->index(0,0);
    selectionModel->setCurrentIndex(currentIndex,QItemSelectionModel::ClearAndSelect);

}

void MainWindow::filePrinted(const QPrintFile&)
{
    model->removeRow(selectedIndex.row());
    selectedIndex = selectionModel->currentIndex();

}

void MainWindow::cancelPrint(const QPrintFile&)
{
    close();
}

void MainWindow::selectionChangedSlot(const QItemSelection &/*newSelection*/,
                                  const QItemSelection &/*oldSelection*/)
{
    selectedIndex = selectionModel->currentIndex();
}


PM MAIL   Вверх
math64
Дата 12.5.2014, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 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 и вызвать 
Код

driver->addFile(printFile);

драйвер должен добавить эту структуру в очередь и вызвать
Код

emit fileAdded(printFile);

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

В обработчике таймера (или кнопки имитирующей печать страницы)
увеличивается на 1 поле printedPages первой структуры в очереди и вызывается
Код

emit pagePrinted(printFile);

Если все страницы напечатаны, вызывается
Код

emit filePrinted(printFile)

а файл удаляется из очереди.

PrintDriverListModel должна слушать эти сигналы и соответственно изменять свой список. 
В обработчике снятия с печати определяются выделенные в списке файлы (следить за изменением выделения не обязательно - его можно всегда получить у списка)
и для каждого выделенного файла вызывается
Код

driver->cancelPrint(printFile);

драйвер вызывает
Код

emit printCanceled(printFile, number); // number - номер в очереди

и удаляет его из очереди
PrintDriverListModel слушает этот сигнал и удаляет файл из своего списка

Это сообщение отредактировал(а) math64 - 12.5.2014, 17:29
PM   Вверх
andrew1ee
Дата 13.5.2014, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 6.5.2014

Репутация: нет
Всего: нет



Получилось как-то так. Но есть ошибки. Классы пока для удобства оставил в одном файле

Код

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QAbstractListModel>
#include <QFile>
#include <QQueue>
#include <QStringListModel>
#include "ui_mainwindow.h"

namespace Ui {
class MainWindow;
}

struct QPrintFile
{
    QString fileName; // Имя файла
    int totalPages; // Всего страниц в файле
    int printedPages; // Число напечатанных страниц
};

class PrinterDriver : public QObject
{
    Q_OBJECT

public slots:
    void addFile(const QPrintFile&);
    void cancelPrint(const QPrintFile&);

private:
    QQueue<QPrintFile> queue;

};

class PrinterDriverListModel : public QAbstractListModel
{

private:
    PrinterDriver *driver;
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

private slots:
    void selectionChangedSlot(const QItemSelection & newSelection, const QItemSelection & oldSelection); 
    void on_addFiles_clicked();
    void on_print_clicked();
    void on_cancel_clicked();

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    PrinterDriver *driver;
    QString file;
    QItemSelectionModel *selectionModel;
    QModelIndex currentIndex, selectedIndex;
    int number;

    void filePrintStarted(const QPrintFile&);
    void pagePrinted(const QPrintFile&);
    void filePrinted(const QPrintFile&);
    void printCanceled(const QPrintFile&, int&);

};

#endif // MAINWINDOW_H



Код

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    driver = new PrinterDriver();
    ui->listView->setModel(new PrinterDriverListModel(driver));

    selectionModel = ui->listView->selectionModel();
    connect(selectionModel, SIGNAL(selectionChanged(const QItemSelection &,const QItemSelection &)),
            this, SLOT(selectionChangedSlot(const QItemSelection &, const QItemSelection &)));

    connect(driver, SIGNAL(filePrintStarted()), this, SLOT(PrinterDriverListModel(driver)));
    connect(driver, SIGNAL(pagePrinted()), this, SLOT(PrinterDriverListModel(driver)));
    connect(driver, SIGNAL(filePrinted()), this, SLOT(PrinterDriverListModel(driver)));
    connect(driver, SIGNAL(printCanceled()), this, SLOT(PrinterDriverListModel(driver)));
}

MainWindow::~MainWindow()
{
    delete ui;
    delete driver;
}

void MainWindow::selectionChangedSlot(const QItemSelection &/*newSelection*/,
                                  const QItemSelection &/*oldSelection*/)
{
    selectedIndex = selectionModel->currentIndex();
}

void MainWindow::on_addFiles_clicked()
{
    file = QFileDialog::getOpenFileName(this, tr("Открыть файл для печати"), "D://",  tr("Office (*.doc *.docx)"));
    QPrintFile printFile;
    printFile.fileName = file;
    driver->addFile(printFile);
    driver->queue.enqueue(printFile);
    emit filePrintStarted(printFile);

    currentIndex = PrinterDriverListModel(driver).index(0,0);
    selectionModel->setCurrentIndex(currentIndex,QItemSelectionModel::ClearAndSelect);
}

void MainWindow::on_print_clicked()
{
    QPrintFile printFile;
    printFile.printedPages =+ 1;
    emit pagePrinted(printFile);
    if (printFile.printedPages == printFile.totalPages)
    {
        emit filePrinted(printFile);
        driver->queue.dequeue(printFile);
    }

    selectedIndex = selectionModel->currentIndex();
}

void MainWindow::on_cancel_clicked()
{
    QPrintFile printFile;
    if (selectionModel->setCurrentIndex(currentIndex,QItemSelectionModel::ClearAndSelect))
    {
        driver->cancelPrint(printFile);
        emit printCanceled(printFile, number); // number - номер в очереди
    }
}


PM MAIL   Вверх
math64
Дата 13.5.2014, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



я же всё подробно расписал в предыдущем сообщении в каких классах что делать. ты же всё делаешь в MainWindow.
Наприер, это должно быть в коде драйвера:
Код

void PrintDriver::addFile(QPrintFile& printFile) {
queue.enqueue(printFile);
emit filePrintStarted(printFile);
}

а это в коде модели:
Код

PrintDriverListModel::PrintDriverListModel(PrintDriver* d) {
driver = d;
connect(driver,SIGNAL(filePrintStarted(QPrintFile), this, SLOT(onFilePrintStarted(QPrintFile)));
...
}
void PrintDriverListModel::onFilePrintStarted(QPrintFile&printFile) {
int count = flieList.count();
beginInsertRows(QModelIndex(), count, count); 
fileList.push_back(printFile);
endInsertRows();
}

Примеры как писать модель можно найти в каталогах expamples и demo, например
examples\itemviews\puzzle\piecesmodel.cpp

Это сообщение отредактировал(а) math64 - 13.5.2014, 21:56
PM   Вверх
andrew1ee
Дата 13.5.2014, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 6.5.2014

Репутация: нет
Всего: нет



И что мне тогда оставлять в слотах on_addFiles_clicked(); on_print_clicked(); on_cancel_clicked()?
Где найти эти примеры?

PS: поймите, что если бы я все знал, я бы сюда не пришел с вопросами.

Это сообщение отредактировал(а) andrew1ee - 13.5.2014, 22:29
PM MAIL   Вверх
math64
Дата 13.5.2014, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Код

void MainWindow::on_addFiles_clicked()
{
    file = QFileDialog::getOpenFileName(this, tr("Открыть файл для печати"), "D://",  tr("Office (*.doc *.docx)"));
    QPrintFile printFile;
    printFile.fileName = file;
    printFile.totalPages = <вычислить число страниц>
    printFile.printedPages = 0;
    driver->addFile(printFile);
}

аналогично для других
PM   Вверх
andrew1ee
Дата 14.5.2014, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 6.5.2014

Репутация: нет
Всего: нет



Понимаю что вызову бурю негодования. Но прошу помощи. Все сроки закончились а программа не готова. Зашел в тупик.

Код

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    driver = new PrinterDriver();
    ui->listView->setModel(new PrinterDriverListModel(driver));

    selectionModel = ui->listView->selectionModel();
    connect(selectionModel, SIGNAL(selectionChanged(const QItemSelection &,const QItemSelection &)),
            this, SLOT(selectionChangedSlot(const QItemSelection &, const QItemSelection &)));

//    connect(driver, SIGNAL(pagePrinted(QPrintFile)), this, SLOT());
}

MainWindow::~MainWindow()
{
    delete ui;
    delete driver;
}

void MainWindow::selectionChangedSlot(const QItemSelection &/*newSelection*/,
                                  const QItemSelection &/*oldSelection*/)
{
    selectedIndex = selectionModel->currentIndex();
}

void MainWindow::on_addFiles_clicked()
{
    file = QFileDialog::getOpenFileName(this, tr("Открыть файл для печати"), "D://",  tr("Office (*.doc *.docx)"));
    QPrintFile printFile;
    printFile.fileName = file;
    int count = file.count();
    printFile.totalPages = count;
    printFile.printedPages = 0;
    driver->addFile(printFile);

    currentIndex = PrinterDriverListModel(driver).index(0,0);
    selectionModel->setCurrentIndex(currentIndex,QItemSelectionModel::ClearAndSelect);
}

void PrinterDriver::addFile(QPrintFile &printFile)
{
    queue.enqueue(printFile);
    emit filePrintStarted(printFile);
}

void PrinterDriverListModel::PrinterDriverListModel(PrinterDriver *d)
{
    driver = d;
    connect(driver,SIGNAL(filePrintStarted(QPrintFile), this, SLOT(onFilePrintStarted(QPrintFile)));
}

void MainWindow::on_print_clicked()
{
    printFile.printedPages =+ 1;
    emit pagePrinted(printFile);
    if (printFile.printedPages == printFile.totalPages)
    {
        driver->onFilePrinted();
    }

    selectedIndex = selectionModel->currentIndex();
}

void PrinterDriverListModel::PrinterDriverListModel(PrinterDriver *d)
{
    driver = d;
    connect(driver,SIGNAL(filePrinted(QPrintFile)), this, SLOT(onFilePrinted(QPrintFile)));
}

void PrinterDriver::onFilePrinted(QPrintFile &printFile)
{
    emit filePrinted(printFile);
    queue.dequeue(printFile);
}

void PrinterDriverListModel::onFilePrintStarted(QPrintFile &printFile)
{
    int count = MainWindow::file.count();
    beginInsertRows(QModelIndex(), count, count);
    MainWindow::file.push_back(printFile);
    endInsertRows();
}

void MainWindow::on_cancel_clicked()
{
    if (selectionModel->setCurrentIndex(currentIndex,QItemSelectionModel::ClearAndSelect))
    {
        driver->cancelPrint();
    }
}

void PrinterDriver::cancelPrint(QPrintFile &printFile)
{
    emit printCanceled(printFile, number); // number - номер в очереди
    queue.removeAt();
}

void PrinterDriverListModel::PrinterDriverListModel(PrinterDriver *d)
{
    driver = d;
    connect(driver,SIGNAL(printCanceled(QPrintFile)), this, SLOT(onPrintCanceled(QPrintFile)));
}

void PrinterDriverListModel::onPrintCanceled(QPrintFile &printFile)
{
    beginRemoveRows(QModelIndex(), count, count);
    MainWindow::file.remove();
    endRemoveRows();
}


PM MAIL   Вверх
math64
Дата 15.5.2014, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



У тебя проблемы с C++. Прежде чем писать для Qt следовало бы выучить C++.
Конструктор не возвращет никакого значения, даже void.
У класса не может быть нескольких конструкторов с одной и той же сигнатурой - их нужно объединить в один.
У класса, производного от абстрактного (QAbstractListModel) нужно реализоваывать все абстрактные методы - компилятор выдаст соответсвующие сообщения об ошибке.
Примеры реализации класса, производного от QAbstractListModel и др. есть вместе с Qt - ищи QAbstractListModel в файлах .cpp и .h в каталогах examples и demo

Добавлено через 2 минуты и 43 секунды
Если нужен доступ к объекту, созданному в конструкторе, запомни его в поле класса, а не создавай каждый раз новый экземпляр:
Код

model =new PrinterDriverListModel(driver)
ui->listView->setModel(model);


Добавлено через 5 минут и 34 секунды
Из PrintDriverListModel нет доступа к полям MainWindоw - список file должен быть полем в PrintDriverListModel
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0961 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.