Hello again.
I changed the code to check if events are implemented correctly.
#include "indicatorwidget.h"
#include <iostream>
{
setAcceptDrops(true);
}
void IndicatorComboBox
::mousePressEvent(QMouseEvent *pEvent
) {
std::cout << "mousePressEvent" << std::endl;
if (pEvent->button() == Qt::LeftButton) {
m_dragStartPosition = pEvent->pos();
}
}
void IndicatorComboBox
::mouseMoveEvent(QMouseEvent *pEvent
) {
std::cout << "mouseMoveEvent" << std::endl;
if (pEvent->buttons() & Qt::LeftButton) {
int distance = (pEvent->pos() - m_dragStartPosition).manhattanLength();
startDrag();
}
}
}
void IndicatorComboBox::startDrag()
{
std::cout << "startDrag" << std::endl;
if (!item.isEmpty()) {
mimeData->setText(item);
drag->setMimeData(mimeData);
drag->exec(Qt::CopyAction);
}
}
{
IndicatorComboBox *source = qobject_cast<IndicatorComboBox *>(pEvent->source());
std::cout << "dragEnterEvent\n" << std::endl;
if (source && source != this) {
pEvent->setDropAction(Qt::CopyAction);
pEvent->accept();
}
}
{
IndicatorComboBox *source = qobject_cast<IndicatorComboBox *>(pEvent->source());
std::cout << "dragEnterEvent" << std::endl;
if (source && source != this) {
pEvent->setDropAction(Qt::CopyAction);
pEvent->accept();
}
}
{
m_indicatorLabel
= new QLabel(this);
m_indicatorComboBox = new IndicatorComboBox(this);
m_indicatorLabel->setAlignment(Qt::AlignCenter);
m_horizontalLayout->addWidget(m_indicatorLabel);
m_horizontalLayout->addWidget(m_indicatorComboBox);
m_indicatorLabel->setText(tr("Indicador:"));
m_indicatorComboBox
->insertItems
(0,
QStringList() << tr
("RSI") << tr
("Volumen"));
setLayout(m_horizontalLayout);
adjustSize();
}
#include "indicatorwidget.h"
#include <iostream>
IndicatorComboBox::IndicatorComboBox(QWidget *parent) : QComboBox(parent)
{
setAcceptDrops(true);
}
void IndicatorComboBox::mousePressEvent(QMouseEvent *pEvent)
{
std::cout << "mousePressEvent" << std::endl;
if (pEvent->button() == Qt::LeftButton) {
m_dragStartPosition = pEvent->pos();
}
QComboBox::mousePressEvent(pEvent);
}
void IndicatorComboBox::mouseMoveEvent(QMouseEvent *pEvent)
{
std::cout << "mouseMoveEvent" << std::endl;
if (pEvent->buttons() & Qt::LeftButton) {
int distance = (pEvent->pos() - m_dragStartPosition).manhattanLength();
if (distance >= QApplication::startDragDistance()) {
startDrag();
}
}
QComboBox::mouseMoveEvent(pEvent);
}
void IndicatorComboBox::startDrag()
{
QString item = currentText();
std::cout << "startDrag" << std::endl;
if (!item.isEmpty()) {
QMimeData *mimeData = new QMimeData;
mimeData->setText(item);
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
drag->exec(Qt::CopyAction);
}
}
void IndicatorComboBox::dragEnterEvent(QDragEnterEvent *pEvent)
{
IndicatorComboBox *source = qobject_cast<IndicatorComboBox *>(pEvent->source());
std::cout << "dragEnterEvent\n" << std::endl;
if (source && source != this) {
pEvent->setDropAction(Qt::CopyAction);
pEvent->accept();
}
}
void IndicatorComboBox::dragMoveEvent(QDragMoveEvent *pEvent)
{
IndicatorComboBox *source = qobject_cast<IndicatorComboBox *>(pEvent->source());
std::cout << "dragEnterEvent" << std::endl;
if (source && source != this) {
pEvent->setDropAction(Qt::CopyAction);
pEvent->accept();
}
}
IndicatorWidget::IndicatorWidget(QWidget *parent) : QWidget(parent)
{
m_horizontalLayout = new QHBoxLayout;
m_indicatorLabel = new QLabel(this);
m_indicatorComboBox = new IndicatorComboBox(this);
m_indicatorLabel->setAlignment(Qt::AlignCenter);
m_horizontalLayout->addWidget(m_indicatorLabel);
m_horizontalLayout->addWidget(m_indicatorComboBox);
m_indicatorLabel->setText(tr("Indicador:"));
m_indicatorComboBox->insertItems(0, QStringList() << tr("RSI") << tr("Volumen"));
setLayout(m_horizontalLayout);
adjustSize();
}
To copy to clipboard, switch view to plain text mode
#ifndef _INDICATORWIDGET_H_
#define _INDICATORWIDGET_H_
#include <QtGui>
{
Q_OBJECT
protected:
void startDrag(void);
public:
IndicatorComboBox
(QWidget *parent
= 0);
signals:
public slots:
};
class IndicatorWidget
: public QWidget{
Q_OBJECT
protected:
IndicatorComboBox *m_indicatorComboBox;
public:
IndicatorWidget
(QWidget *parent
= 0);
signals:
public slots:
};
#endif /* _INDICATORWIDGET_H_ */
#ifndef _INDICATORWIDGET_H_
#define _INDICATORWIDGET_H_
#include <QtGui>
class IndicatorComboBox : public QComboBox
{
Q_OBJECT
protected:
QPoint m_dragStartPosition;
void mousePressEvent(QMouseEvent *pEvent);
void mouseMoveEvent(QMouseEvent *pEvent);
void dragEnterEvent(QDragEnterEvent *pEvent);
void dragMoveEvent(QDragMoveEvent *pEvent);
void startDrag(void);
public:
IndicatorComboBox(QWidget *parent = 0);
signals:
public slots:
};
class IndicatorWidget : public QWidget
{
Q_OBJECT
protected:
QHBoxLayout *m_horizontalLayout;
QLabel *m_indicatorLabel;
IndicatorComboBox *m_indicatorComboBox;
public:
IndicatorWidget(QWidget *parent = 0);
signals:
public slots:
};
#endif /* _INDICATORWIDGET_H_ */
To copy to clipboard, switch view to plain text mode
My surprise has been that events mouseMoveEvent (), dragEnterEvent () and dragMoveEvent () not run if you run the event QComboBox: mousePressEvent (line 18). If I delete line 18, all events are executed but the combobox will not open. Any ideas?
Thanks In advance.
Bookmarks