Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

Давайте начнем с реализации виджета и сначала приведем заголовочный файл:

01 #ifndef SPREADSHEET_H

02 #define SPREADSHEET_H

03 #include <QTableWidget>

04 class Cell;

05 class SpreadsheetCompare;

Заголовочный файл начинается с предварительных объявлений классов Cell и SpreadsheetCompare.

Рис. 4.1.

Деревья наследования для классов Spreadsheet и Cell.

Такие атрибуты ячейки QTableWidget, как ее текст и выравнивание, хранятся в QTableWidgetltem. В отличие от QTableWidget, класс QTableWidgetltem не является виджетом; это обычный класс данных. Класс Cell наследует QTableWidgetltem, и мы рассмотрим этот класс в последнем разделе данной главы, где представим его реализацию.

06 class Spreadsheet : public QTableWidget

07 {

08 Q_OBJECT

09 public:

10 Spreadsheet(QWidget *parent = 0);

11 bool autoRecalculate const { return autoRecalc; }

12 QString currentLocation const;

13 QString currentFormula const;

14 QTableWidgetSelectionRange selectedRange const;

15 void clear;

16 bool readFile(const QString &fileName);

17 bool writeFile(const QString &fileName);

18 void sort(const SpreadsheetCompare &compare);

Функция autoRecalculate реализуется как встроенная (inline), поскольку она лишь показывает, задействован или нет режим автоматического перерасчета.

В главе 3 мы опирались на использование некоторых открытых функций класса электронной таблицы Spreadsheet при реализации MainWindow Например, из MainWindow::newFile мы вызывали функцию clear для очистки электронной таблицы. Кроме того, мы вызывали некоторые функции, унаследованные от QTableWidget, а именно setCurrentCell и setShowGrid.

19 public slots:

20 void cut;

21 void copy;

22 void paste;

23 void del;

24 void selectCurrentRow;

25 void selectCurrentColumn;

26 void recalculate;

27 void setAutoRecalculate(bool recalc);

28 void findNext(const QString &str, Qt::CaseSensitivity cs);

29 void findPrevious(const QString &str, Qt::CaseSensitivity cs);

30 signals:

31 void modified;

Класс Spreadsheet

содержит много слотов, которые реализуют действия пунктов меню Edit, Tools и Options, и он содержит один сигал modified для уведомления о возникновении любого изменения.

32 private slots:

33 void somethingChanged;

Мы определяем один закрытый слот, который используется внутри класса Spreadsheet.

34 private:

35 enum { MagicNumber = 0x7F51C883, RowCount = 999, ColumnCount = 26 };

36 Cell *cell(int row, int column) const;

37 QString text(int row, int column) const;

38 QString formula(int row, int column) const;

39 void setFormula(int row, int column, const QString &formula);

40 bool autoRecalc;

41 };

В закрытой секции этого класса мы объявляем три константы, четыре функции и одну переменную.

42 class SpreadsheetCompare

43 {

44 public:

45 bool operator(const QStringList &row1, const QStringList &row2) const;

46 enum { KeyCount = 3 };

47 int keys[KeyCount];

48 bool ascending[KeyCount];

49 };

50 #endif

Заголовочный файл заканчивается определением класса SpreadsheetCompare. Мы объясним назначение этого класса при рассмотрении функции Spreadsheet::sort.

Теперь мы рассмотрим реализацию:

01 #include <QtGui>

02 #include "cell.h"

03 #include "spreadsheet.h"

04 Spreadsheet::Spreadsheet(QWidget *parent)

05 : QTableWidget(parent)

06 {

07 autoRecalc = true;

08 setItemPrototype(new Cell);

09 setSelectionMode(ContiguousSelection);

10 connect(this, SIGNAL(itemChanged(QTableWidgetItem *)),

11 this, SLOT(somethingChanged));

12 clear;

13 }

Обычно при вводе пользователем некоторого текста в пустую ячейку QTableWidget будет автоматически создавать элемент QTableWidgetltem для хранения этого текста. Вместо этого мы хотим, чтобы создавались элементы Cell. Это достигается с помощью вызова в конструкторе функции setItemPrototype. Всякий раз, когда требуется новый элемент, QTableWidget дублирует элемент, переданный в качестве прототипа.

Поделиться:
Популярные книги

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Черный Маг Императора 8

Герда Александр
8. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 8

Измена. Отбор для предателя

Лаврова Алиса
1. Отбор для предателя
Фантастика:
фэнтези
5.00
рейтинг книги
Измена. Отбор для предателя

Кодекс Крови. Книга II

Борзых М.
2. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга II

Шаг в бездну

Муравьёв Константин Николаевич
3. Перешагнуть пропасть
Фантастика:
фэнтези
космическая фантастика
7.89
рейтинг книги
Шаг в бездну

Часовая битва

Щерба Наталья Васильевна
6. Часодеи
Детские:
детская фантастика
9.38
рейтинг книги
Часовая битва

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Хроники странного королевства. Вторжение. (Дилогия)

Панкеева Оксана Петровна
110. В одном томе
Фантастика:
фэнтези
9.38
рейтинг книги
Хроники странного королевства. Вторжение. (Дилогия)

Часовой ключ

Щерба Наталья Васильевна
1. Часодеи
Фантастика:
фэнтези
9.36
рейтинг книги
Часовой ключ

Инвестиго, из медика в маги

Рэд Илья
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Инвестиго, из медика в маги

Кротовский, может, хватит?

Парсиев Дмитрий
3. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
7.50
рейтинг книги
Кротовский, может, хватит?

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Очешуеть! Я - жена дракона?!

Амеличева Елена
Фантастика:
юмористическая фантастика
5.43
рейтинг книги
Очешуеть! Я - жена дракона?!

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9