Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] На drag&drop меняем местами строки QTableView


Автор: NumLock 18.12.2008, 12:37
Есть потомок QTableView. В нем реализован drag&drop. Т.е. есть методы начинающие "перетаскивание" и разрешающие "бросание". Сам он поддерживает бросание "из самого себя". Необходимо, чтобы строки перетаскивались вслед за указателем мыши, и вставлялись между той строкой куда её бросили, и соседней. Посоветуйте, пожалуйста, в какую сторону посмотреть.

Автор: SABROG 18.12.2008, 13:00
Скорее всего придется воспользоваться делегатами. Перед началом операции перетаскивания надо будет "захватить" rect строки или несколько rect'ов с каждого итема в строке и сложить их в один прямоугольник (думаю можно будет глянуть исходники QAbstractItemView в месте где идет полное выделение строк синим цветом), сохранить изображение из этого rect'a в QPixmap и установить для QDrag. Отслеживать положение мышки над строками, чтобы выделять жирным верх или низ границы, чтобы было видно куда дропнется строка (или если хватит фантазии как-то сделать плавное раздвижение строк в пустое пространство с магнитизмом, т.е. чтобы новая строка при этом еще в нужный паз вставала).

Автор: NumLock 20.12.2008, 07:14
Я не нашел способа рисовать на QTableView. Я пытался сделать так:
Код
void
MyClass::paintEvent(QPaintEvent* paint)
{
    QTableView::paintEvent(paint);
    QPainter painter(this);
    painter.drawLine(0, 0, 200, 200); // для проверки
    painter.end();
}


У меня в приложении ведется лог через стандартный QDebug. Вот в логе было написано следующее:
Код
(warning): QPainter::begin: Widget painting can only begin as a result of a paintEvent
(warning): QPainter::end: Painter not active, aborted


Со второй строчкой все понятно, а вот что означает первая. Подскажите, пожалуйста, чего я не понимаю.

Автор: NumLock 20.12.2008, 10:25
Нашел решение.
Код
void
MyClass::paintEvent(QPaintEvent* event)
{
    QTableView::paintEvent(event);
    QPainter painter(viewport());
    // отрисовка
    painter.end();
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)