Reputation: 557
I have a QTextEdit with text. The user is allowed to change the text only from the QCursor position stored in startPos
variable to the end of document. The begining of the text must remain the same.
I managed to do that by conditioning of QCursor position.
But user can at any moment drag and drop some text in forbidden area.
I want to make a conditional drag and drop according to QCursor position. So, if user drop some text in forbidden area (before cursor position startPos
) I want to put that text at the end of the document. And if user drop text after cursor position startPos
, user to be allowed to do so.
class BasicOutput : public QTextEdit, public ViewWidgetIFace
{
Q_OBJECT
public:
BasicOutput();
~BasicOutput();
virtual void dragEnterEvent(QDragEnterEvent *e);
virtual void dropEvent(QDropEvent *event);
private:
int startPos;
};
and the rest of simplified (non-functional) code:
BasicOutput::BasicOutput( ) : QTextEdit () {
setInputMethodHints(Qt::ImhNoPredictiveText);
setFocusPolicy(Qt::StrongFocus);
setAcceptRichText(false);
setUndoRedoEnabled(false);
}
void BasicOutput::dragEnterEvent(QDragEnterEvent *e){
e->acceptProposedAction();
}
void BasicOutput::dropEvent(QDropEvent *event){
QPoint p = event->pos(); //get position of drop
QTextCursor t(textCursor()); //create a cursor for QTextEdit
t.setPos(&p); //try convert QPoint to QTextCursor to compare with position stored in startPos variable - ERROR
//if dropCursorPosition < startPos then t = endOfDocument
//if dropCursorPosition >= startPos then t remains the same
p = t.pos(); //convert the manipulated cursor position to QPoint - ERROR
QDropEvent drop(p,event->dropAction(), event->mimeData(), event->mouseButtons(), event->keyboardModifiers(), event->type());
QTextEdit::dropEvent(&drop); // Call the parent function w/ the modified event
}
The errors are:
In member function 'virtual void BasicOutput::dropEvent(QDropEvent*)':
error: 'class QTextCursor' has no member named 'setPos' t.setPos(&p);
error: 'class QTextCursor' has no member named 'pos'p = t.pos();
How to protect the forbidden text area from user drag and drop?
Rspectfully, Florin.
void BasicOutput::dragEnterEvent(QDragEnterEvent *e){
if (e->mimeData()->hasFormat("text/plain"))
e->acceptProposedAction();
else
e->ignore();
}
void BasicOutput::dragMoveEvent (QDragMoveEvent *event){
QTextCursor t = cursorForPosition(event->pos());
if (t.position() >= startPos){
event->acceptProposedAction();
QDragMoveEvent move(event->pos(),event->dropAction(), event->mimeData(), event->mouseButtons(), event->keyboardModifiers(), event->type());
QTextEdit::dragMoveEvent(&move); // Call the parent function (show cursor and keep selection)
}else
event->ignore();
}
Upvotes: 0
Views: 1354
Reputation: 12879
You currently have...
QTextCursor t(textCursor()); //create a cursor for QTextEdit
t.setPos(&p);
If you want a QTextCursor associated with the proposed drop location you should use...
QTextCursor t = cursorForPosition(p);
That should fix the first compilation error. Unfortunately there doesn't appear to be any obvious way to get the QPoint associated with a QTextCursor (though there may be a way going via QTextDocument and QTextBlock, I haven't checked). If that's the case then you'll have to perform the drop yourself...
if (t.position() < startPos)
t.movePosition(QTextCursor::End);
setTextCursor(t);
insertPlainText(event->mimeData()->text());
However, can I suggest that what you are attempting to do might prove very confusing to the user. There should be some visual indicator as to what will happen if the text is dropped. How is the user to know that if they drop the text on the forbidden area it will be appended to the end of the current text -- which may not even be visible on a large document?
With that in mind a better approach might be to override dragMoveEvent...
void BasicOutput::dragMoveEvent (QDragMoveEvent *event)
{
QTextCursor t = cursorForPosition(p);
if (t.position() >= startPos)
event->acceptProposedAction();
}
Here the proposed drop action is only accepted if the mouse pointer is not in the forbidden region. Otherwise the user will see (via the pointer glyph or whatever) that the drop will not be accepted.
Upvotes: 1