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

ЖАНРЫ

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

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

Шрифт:

11 }

12 QString MyTableWidget::toHtml(const QString &plainText)

13 {

14 QString result = Qt::escape(plainText);

15 result.replace("\t", "<td>");

16 result.replace("\n", "\n<tr><td>");

17 result.prepend("<table>\n<tr><td>");

18 result.append("\n</table>");

19 return result;

20 }

Функции toCsv

и toHtml преобразуют строку со знаками табуляции и конца строки в формат CSV (comma—separated values — значения, разделенные запятыми) и HTML соответственно. Например, данные

Red Green Blue

Cyan Yellow Magenta

преобразуются в

"Red", "Green", "Blue"

"Cyan", "Yellow", "Magenta"

или в

<table>

<tr><td>Red<td>Green<td>Blue

<tr><td>Cyan<td>Yellow<td>Magenta

</table>

Преобразование выполняется самым простым из возможных способов с применением функции QString::replace. Для удаления специальных символов формата HTML мы используем функцию Qt::escape.

01 void MyTableWidget::dropEvent(QDropEvent *event)

02 {

03 if (event->mimeData->hasFormat("text/csv")) {

04 QByteArray csvData = event->mimeData->data("text/csv");

05 QString csvText = QString::fromUtf8(csvData);

06 …

07 event->acceptProposedAction;

08 } else if (event->mimeData->hasFormat("text/plain")) {

09 QString plainText = event->mimeData->text;

10 …

11 event->acceptProposedAction;

12 }

13 }

Хотя мы предоставляем данные в трех разных форматах, мы принимаем в dropEvent только два из них. Если подьзователь переносит ячейки из таблицы QTableWidget в редактор HTML, нам нужно, чтобы ячейки были преобразованы в таблицу HTML. Но если пользователь переносит произвольный текст HTML в таблицу QTableWidget, мы не станем его принимать.

Для того чтобы этот пример заработал, нам потребуется также вызвать setAcceptDrops(true) и setSelectionMode(ContiguousSelection) в конструкторе MyTableWidget.

Теперь мы переделаем этот пример, но на этот раз мы создадим подкласс QMimeData, чтобы отложить или избежать (потенциально затратных) преобразований между элементами QTableWidgetltem и массивом QByteArray. Ниже приводится определение нашего подкласса:

01 class TableMimeData : public QMimeData

02 {

03 Q_OBJECT

04 public:

05 TableMimeData(const QTableWidget *tableWidget,

06 const QTableWidgetSelectionRange &range);

07 const QTableWidget *tableWidget const

08 { return myTableWidget; }

09 QTableWidgetSelectionRange range const { return myRange; }

10 QStringList formats const;

11 protected:

12 QVariant retrieveData(const QString &format,

13 QVariant::Type preferredType) const;

14 private:

15 static QString toHtml(const QString &plainText);

16 static QString toCsv(const QString &plainText);

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

18 QString rangeAsPlainText const;

19 const QTableWidget *myTableWidget;

20 QTableWidgetSelectionRange myRange;

21 QStringList myFormats;

22 };

Вместо

реальных данных мы храним объект QTableWidgetSelectionRange, который определяет область переносимых ячеек и сохраняет указатель на QTableWidget. Функции formats и retrieveData класса QMimeData переопределяются.

01 TableMimeData::TableMimeData(const QTableWidget *tableWidget,

02 const QTableWidgetSelectionRange &range)

03 {

04 myTableWidget = tableWidget;

05 myRange = range;

06 myFormats << "text/csv" << "text/html" << "text/plain";

07 }

В конструкторе мы инициализируем закрытые переменные.

01 QStringList TableMimeData::formats const

02 {

03 return myFormats;

04 }

Функция formats возвращает список MIME—типов, находящихся в объекте MIME—данных. Последовательность форматов обычно несущественна, однако на практике желательно первыми указывать «лучшие» форматы. Приложения, поддерживающие несколько форматов, иногда будут использовать первый подходящий.

01 QVariant TableMimeData::retrieveData(const QString &format,

02 QVariant::Type preferredType) const

03 {

04 if (format == "text/plain") {

05 return rangeAsPlainText;

06 } else if (format =="text/csv") {

07 return toCsv(rangeAsPlainText); }

08 else if (format == "text/html") {

09 return toHtml(rangeAsPlainText);

10 } else {

11 return QMimeData::retrieveData(format, preferredType);

12 }

13 }

Поделиться с друзьями: