/
ArtemNech
/
simpleOpenGL
Обзор
Документация
Войти
/
ArtemNech
/
simpleOpenGL
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
devOpt
gui/forms/promoted/cpaletteitem.cpp
118 строк
3 KB
Artem Nechitaylenko
Qt GUI isolated from backend except QEvent. Need fix
18 май 2026, 13:41
18 май 2026, 13:41
f09d1f2
Код
Авторство
О чём код?
#include "cpaletteitem.h" #include "../../../backend/diagram/CDiagram.h" #include <QListWidgetItem> #include <QBuffer> #include <QDrag> #include <QDragEnterEvent> #include <qpainter.h> CPaletteItem::CPaletteItem(QWidget *parent) : QListWidget(parent) { setSelectionMode(QAbstractItemView::SingleSelection); setDragDropMode(QAbstractItemView::DragOnly); setDefaultDropAction(Qt::IgnoreAction); setSelectionMode(QAbstractItemView::SingleSelection); setDragEnabled(true); setDragDropMode(QAbstractItemView::DragOnly); setDefaultDropAction(Qt::IgnoreAction); setAcceptDrops(false); setDropIndicatorShown(false); /* setIconSize(QSize(32, 32)); setViewMode(QListView::ListMode); setMovement(QListView::Static); setSpacing(5);*/ fillPalettePage(); } CPaletteItem::~CPaletteItem() { } QMimeData *CPaletteItem::mimeData(const QList<QListWidgetItem *> &items) const { if (items.isEmpty()) return nullptr; QListWidgetItem *item = items.first(); auto *mimeData = new QMimeData(); mimeData->setProperty("source", "palette"); int comp_type = item->data(Qt::UserRole).toInt(); mimeData->setProperty("comp_type", comp_type); mimeData->setText(item->text()); if (!item->icon().isNull()) { QPixmap pixmap = item->icon().pixmap(32, 32); QByteArray byteArray; QBuffer buffer(&byteArray); buffer.open(QIODevice::WriteOnly); pixmap.save(&buffer, "PNG"); mimeData->setData("application/x-icon", byteArray); } mimeData->setData("application/x-item-type", item->data(Qt::UserRole).toByteArray()); return mimeData; } void CPaletteItem::startDrag(Qt::DropActions supportedActions) { QListWidgetItem *item = currentItem(); if (!item) return; QDrag *drag = new QDrag(this); drag->setMimeData(mimeData(QList<QListWidgetItem*>() << item)); // Создаем пиксельную карту для перетаскивания QPixmap pixmap = item->icon().pixmap(32, 32); if (pixmap.isNull()) { // Если нет иконки, создаем с текстом QFontMetrics fm(font()); int width = fm.horizontalAdvance(item->text()) + 20; pixmap = QPixmap(width, 30); pixmap.fill(Qt::lightGray); QPainter painter(&pixmap); painter.drawText(pixmap.rect(), Qt::AlignCenter, item->text()); } drag->setPixmap(pixmap); drag->setHotSpot(QPoint(pixmap.width() / 2, pixmap.height() / 2)); // Запускаем drag drag->exec(supportedActions, Qt::CopyAction); } void CPaletteItem::dragEnterEvent(QDragEnterEvent *event) { event->ignore(); } void CPaletteItem::dragMoveEvent(QDragMoveEvent *event) { event->ignore(); } void CPaletteItem::dropEvent(QDropEvent *event) { event->ignore(); } void CPaletteItem::fillPalettePage() { for (uint8_t i = 1; i < DT_COUNT; i++) { auto item = new QListWidgetItem(QIcon(icons.at(i)), names[i], this); item->setData(Qt::UserRole, i); } }