Читаем QT 4: программирование GUI на С++ полностью

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 ⦥);

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 ⦥)

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 }

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже