QT 4: программирование GUI на С++ | страница 73



но также и для QBuffer, QProcess, QTcpSocket или QUdpSocket. Qt также предоставляет класс QTextStream, который может использоваться с QDataStream для чтения и записи текстовых файлов. В главе 10 подробно рассматриваются эти классы и описываются различные методы работы с разными версиями QDataStream.

>01 bool Spreadsheet::readFile(const QString &fileName)

>02 {

>03 QFile file(fileName);

>04 if (!file.open(QIODevice::ReadOnly)) {

>05 QMessageBox::warning(this, tr("Spreadsheet"),

>06 tr("Cannot read file %1:\n%2.")

>07 .arg(file.fileName())

>08 .arg(file.errorString()));

>09 return false;

>10 }


>11 QDataStream in(&file);

>12 in.setVersion(QDataStream::Qt_4_1);

>13 quint32 magic;

>14 in >> magic;

>15 if (magic != MagicNumber) {

>16 QMessageBox::warning(this, tr("Spreadsheet"),

>17 tr("The file is not a Spreadsheet file."));

>18 return false;

>19 }


>20 clear();

>21 quint16 row;

>22 quint16 column;

>23 QString str;

>24 QApplication::setOverrideCursor(Qt::WaitCursor);

>25 while (!in.atEnd()) {

>26 in >> row >> column >> str;

>27 setFormula(row, column, str);

>28 }

>29 QApplication::restoreOverrideCursor();

>30 return true;

>31 }

Функция readFile() очень напоминает writeFile(). Для чтения файла мы пользуемся объектом QFile, но теперь мы используем флажок QIODevice::ReadOnly, а не QIODevice::WriteOnly. Затем мы устанавливаем версию QDataStream на значение 7. Формат чтения всегда должен совпадать с форматом записи.

Если в начале файла содержится правильное «волшебное» число, мы вызываем функцию clear() для очистки в электронной таблице всех ячеек и затем считываем данные ячеек. Поскольку файл содержит только данные для непустых ячеек, маловероятно, что будет заполнена каждая ячейка электронной таблицы, поэтому мы должны очистить все ячейки перед чтением файла.

Реализация меню Edit

Теперь мы готовы приступить к реализации слотов, относящихся к меню Edit данного приложения.

Рис. 4.4. Меню Edit приложения Электронная таблица.

>01 void Spreadsheet::cut()

>02 {

>03 copy();

>04 del();

>05 }

Слот cut() соответствует пункту меню Edit | Cut (Правка | Вырезать). Он реализуется просто, поскольку операция Cut выполняется с помощью операции Сору, за которой следует операция Delete.

>01 void Spreadsheet::copy()