LINUX.ORG.RU

QGraphicsView - отображение текста


0

0

Есть QTreeWidgetItem, у каждого элемента есть IDшник, в зависимости от него нужно рисовать то или иное на QGraphicsView при перетаскивании.

Пока не приделывал QGraphicsScene к QGraphicsView, перетаскивание работало, теперь даже QDebug, который расположил в соответствующем обработчике событий, перестал работать.

Определил QGraphicsScene в хидере, чтобы можно было обращаться к ней из любого метода объекта-формы:

QGraphicsScene *scene;

В конструкторе формы инициализирую указатель и привязываю QGraphicsScene к QGraphicsView:

m_ui->cond_view->setDragEnabled(true);
    m_ui->term_view->setDragEnabled(true);
    m_ui->oper_view->setDragEnabled(true);//виджеты, с которых будем перетаскивать
    scene  = new QGraphicsScene(this);//инициализируем сцену
    m_ui->gcond->setScene(scene);//привязываем её
    setAcceptDrops(true);//по всей форме разрешены drop`ы
    m_ui->gcond->setAcceptDrops(true);//на всякий случай здесь тоже персонально разрешаем Drop

Обработка drag & drop:

void addcondition::dropEvent ( QDropEvent * event )
{
    //qDebug()<<m_ui->cond_view->currentItem()->statusTip(0); //это работало до того, как было сделано обращение к сцене
    event->acceptProposedAction();
    scene->addText(m_ui->cond_view->currentItem()->statusTip(0));
    m_ui->gcond->show();//не работает
}
void addcondition::dragEnterEvent(QDragEnterEvent *event)
{
        event->acceptProposedAction();
}
void addcondition::mouseMoveEvent( QMouseEvent * event)
{
    if (event->button() == Qt::LeftButton)
    {
        QDrag *drag = new QDrag(this);
        Qt::DropAction dropAction = drag->exec();
    }
}

К сожалению, в документации ничего вразумительного не нашел>_> Может, кто-нибудь работал с QGraphicsView?

★★★★

QDrag должен создаваться не в Graphics View, а в QTreeWidget. Делать event->accept() на всё, что вам подсунули в dragEnterEvent() приведёт к тому, что перетягивая (к примеру) файл в вашу сцену она будет обращаться к текущему элементу в дереве. Сделайте собственную мнемонику (QMimeData), положите в неё ID вашего элемента, проверяйте на мнемонику в dragEnterEvent(). Подробнее читайте в документации по QMimeData::setData().

Dendy ★★★★★ ()

в Graphics Framework надо использовать hoverMoveEvent, кажется, вместо mouseMoveEvent. И в конструкторе прописать setAcceptsHoverEvents(true); Кажется так.

irq ()
Ответ на: комментарий от Dendy

Сейчас QDrag создается как дочерний объект формы, на которой расположены и QGraphicsView и QTreeWidget. Пробовал унаследовать его от QtreeWidget'a(того, который сейчас выделен) - не помогло. Текст по прежнему не удается передать через drag & drop. А вообще, Ваш ответ напоминает древний анекдот:"-Товарищ военный, мы к станции правильно идем? -Где же правильно? Удар стопы нечеткий, голеностоп вихляет, да и вообще, не в ногу!". Сейчас проблема не в том, что перетаскивание работает как-то не так. Проблема в том, чтооно вообще не работает.

void addcondition::dragEnterEvent(QDragEnterEvent *event)
{
    qDebug()<<event->mimeData()->text();
        event->acceptProposedAction();
}
void addcondition::mouseMoveEvent( QMouseEvent * event)
{
    if (event->button() == Qt::LeftButton)
    {
        QDrag *drag;
        QMimeData *mimeData = new QMimeData;
        if(m_ui->toolBox->currentIndex()==0)
        {
            drag = new QDrag(m_ui->cond_view);
            mimeData->setText("sometext");
            drag->setMimeData(mimeData);
        }
        if(m_ui->toolBox->currentIndex()==1)
        {
            drag = new QDrag(m_ui->term_view);
            mimeData->setText("sometext2");
            drag->setMimeData(mimeData);
        }
        if(m_ui->toolBox->currentIndex()==2)
        {
            drag = new QDrag(m_ui->oper_view);
            mimeData->setText("sometext3");
            drag->setMimeData(mimeData);
        }
        Qt::DropAction dropAction = drag->exec();
    }
}
wingear ★★★★ ()
Ответ на: комментарий от irq

К сожалению

/home/oleg/cogito/addcondition.cpp:40: error: ‘class QGraphicsView’ has no member named ‘setAcceptHoverEvents’
:-(

wingear ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.