QTextEdit functionality
-
Programmatically I've created an instance of QTextEdit and added to a window, however for some reason space and carriage return do not work unless I type in an alpha, then cursor back to the previous position and then space and carriage return work.
Any suggestions what could explain this behaviour ?
-
Programmatically I've created an instance of QTextEdit and added to a window, however for some reason space and carriage return do not work unless I type in an alpha, then cursor back to the previous position and then space and carriage return work.
Any suggestions what could explain this behaviour ?
Hi,
Any filter or other widgets stealing the focus ?
Without more details it's hard to tell.
-
Programmatically I've created an instance of QTextEdit and added to a window, however for some reason space and carriage return do not work unless I type in an alpha, then cursor back to the previous position and then space and carriage return work.
Any suggestions what could explain this behaviour ?
-
@J-Hilk , I don't think so, I've been working on this project for a long time, coming back to it when I have spare time, this is my derived class:
/** * File: clsQtTextEdit.cpp * Notes: Contains implementation of the overriden signal/slot * helper class for the QTextEdit control * History: 2020/06/11 Created by Simon Platten */ #include <clsCNT.h> #include <clsQtTextEdit.h> #include <clsScriptHelper.h> //Static members const char clsQtTextEdit::mscszQtSignalCopyAvailable[] = "copyAvailable"; const char clsQtTextEdit::mscszQtSignalCurrentCharFormatChanged[] = "currentCharFormatChanged"; const char clsQtTextEdit::mscszQtSignalCursorPositionChanged[] = "cursorPositionChanged"; const char clsQtTextEdit::mscszQtSignalRedoAvailable[] = "redoAvailable"; const char clsQtTextEdit::mscszQtSignalSelectionChanged[] = "selectionChanged"; const char clsQtTextEdit::mscszQtSignalTextChanged[] = "textChanged"; const char clsQtTextEdit::mscszQtSignalUndoAvailable[] = "undoAvailable"; mpSignals clsQtTextEdit::mscmpSignals = { std::make_pair(QString(clsQtTextEdit::mscszQtSignalCopyAvailable) ,new clsSignal(clsCNT::mscszTextEdit ,clsQtTextEdit::mscszQtSignalCopyAvailable)) ,std::make_pair(QString(clsQtTextEdit::mscszQtSignalCurrentCharFormatChanged) ,new clsSignal(clsCNT::mscszTextEdit ,clsQtTextEdit::mscszQtSignalCurrentCharFormatChanged)) ,std::make_pair(QString(clsQtTextEdit::mscszQtSignalCursorPositionChanged) ,new clsSignal(clsCNT::mscszTextEdit ,clsQtTextEdit::mscszQtSignalCursorPositionChanged)) ,std::make_pair(QString(clsQtTextEdit::mscszQtSignalRedoAvailable) ,new clsSignal(clsCNT::mscszTextEdit ,clsQtTextEdit::mscszQtSignalRedoAvailable)) ,std::make_pair(QString(clsQtTextEdit::mscszQtSignalSelectionChanged) ,new clsSignal(clsCNT::mscszTextEdit ,clsQtTextEdit::mscszQtSignalSelectionChanged)) ,std::make_pair(QString(clsQtTextEdit::mscszQtSignalTextChanged) ,new clsSignal(clsCNT::mscszTextEdit ,clsQtTextEdit::mscszQtSignalTextChanged)) ,std::make_pair(QString(clsQtTextEdit::mscszQtSignalUndoAvailable) ,new clsSignal(clsCNT::mscszTextEdit ,clsQtTextEdit::mscszQtSignalUndoAvailable)) }; /** * @brief clsQtTextEdit::clsQtTextEdit * @param pobjNode : Pointer to XML node * @param pstrCSS : Pointer to CSS * @param pslstProperties : Pointer to properties * @param pParent : Pointer to parent widget */ clsQtTextEdit::clsQtTextEdit(clsXMLnode* pobjNode, QString* pstrCSS , QStringList* pslstProperties , QWidget* pParent) : QTextEdit(pParent), clsXMLinterface(pobjNode) { mpobjNode->setWidget(this); //Should always be first line in constructor clsXMLnode::addSignalsToMap(&clsQtTextEdit::mscmpSignals); //Any properties if ( pslstProperties != nullptr ) { foreach( QString strProperty, *pslstProperties ) { QStringList slstProperty(strProperty.split(clsXMLnode::msccPropertyDelimiter)); if ( slstProperty.length() != 2 ) { continue; } setProperty(slstProperty[0], slstProperty[1]); } } if ( pstrCSS != nullptr && pstrCSS->isEmpty() != true ) { setStyleSheet(*pstrCSS); } QString strColumns(mpobjNode->strGetAttribute(clsXMLnode::mscszAttrColumns)) ,strRows(mpobjNode->strGetAttribute(clsXMLnode::mscszAttrRows)); QRect rctGeom(geometry()); bool blnModified(false); if ( strColumns.isEmpty() != true ) { int intCharWidth(QFontMetrics(font()).maxWidth()) ,intPixelWidth(strColumns.toInt() * intCharWidth); rctGeom.setWidth(intPixelWidth); setFixedWidth(intPixelWidth); blnModified = true; } if ( strRows.isEmpty() != true ) { int intCharHeight(QFontMetrics(font()).height()) ,intPixelHeight(strRows.toInt() * (intCharHeight + 1)); rctGeom.setHeight(intPixelHeight); setFixedHeight(intPixelHeight); blnModified = true; } if ( blnModified == true && rctGeom.isValid() == true ) { mpobjNode->setGeometry(rctGeom); } if ( blnModified == true ) { QWidget* pobjWidget(mpobjNode->pobjGetWidget()); if ( pobjWidget != nullptr ) { pobjWidget->setMinimumSize(rctGeom.width(), rctGeom.height()); } } //Connect native signals to repeater signals QMetaObject::Connection cn; cn = QObject::connect(this, &clsQtTextEdit::copyAvailable ,this, &clsQtTextEdit::rptrCopyAvailable); Q_ASSERT_X(cn, clsQtTextEdit::metaObject()->className() ,QString(clsXMLnode::mscszAssertCannotConnectToRepeater) .arg(clsQtTextEdit::mscszQtSignalCopyAvailable) .toLocal8Bit().data()); cn = QObject::connect(this, &clsQtTextEdit::currentCharFormatChanged ,this, &clsQtTextEdit::rptrCurrentCharFormatChanged); Q_ASSERT_X(cn, clsQtTextEdit::metaObject()->className() ,QString(clsXMLnode::mscszAssertCannotConnectToRepeater) .arg(clsQtTextEdit::mscszQtSignalCurrentCharFormatChanged) .toLocal8Bit().data()); cn = QObject::connect(this, &clsQtTextEdit::cursorPositionChanged ,this, &clsQtTextEdit::rptrCursorPositionChanged); Q_ASSERT_X(cn, clsQtTextEdit::metaObject()->className() ,QString(clsXMLnode::mscszAssertCannotConnectToRepeater) .arg(clsQtTextEdit::mscszQtSignalCursorPositionChanged) .toLocal8Bit().data()); cn = QObject::connect(this, &clsQtTextEdit::redoAvailable ,this, &clsQtTextEdit::rptrRedoAvailable); Q_ASSERT_X(cn, clsQtTextEdit::metaObject()->className() ,QString(clsXMLnode::mscszAssertCannotConnectToRepeater) .arg(clsQtTextEdit::mscszQtSignalRedoAvailable) .toLocal8Bit().data()); cn = QObject::connect(this, &clsQtTextEdit::selectionChanged ,this, &clsQtTextEdit::rptrSelectionChanged); Q_ASSERT_X(cn, clsQtTextEdit::metaObject()->className() ,QString(clsXMLnode::mscszAssertCannotConnectToRepeater) .arg(clsQtTextEdit::mscszQtSignalSelectionChanged) .toLocal8Bit().data()); cn = QObject::connect(this, &clsQtTextEdit::textChanged ,this, &clsQtTextEdit::rptrTextChanged); Q_ASSERT_X(cn, clsQtTextEdit::metaObject()->className() ,QString(clsXMLnode::mscszAssertCannotConnectToRepeater) .arg(clsQtTextEdit::mscszQtSignalTextChanged) .toLocal8Bit().data()); cn = QObject::connect(this, &clsQtTextEdit::undoAvailable ,this, &clsQtTextEdit::rptrUndoAvailable); Q_ASSERT_X(cn, clsQtTextEdit::metaObject()->className() ,QString(clsXMLnode::mscszAssertCannotConnectToRepeater) .arg(clsQtTextEdit::mscszQtSignalUndoAvailable) .toLocal8Bit().data()); mpobjWindow = mpobjNode->pobjGetWindow(); if ( mpobjWindow != nullptr ) { cn = QObject::connect(mpobjWindow, &clsXMLnode::blankControls ,this, &clsQtTextEdit::blankControl); Q_ASSERT_X(cn, clsQtTextEdit::metaObject()->className() ,QString(clsXMLnode::mscszAssertCannotConnect) .arg(clsXMLnode::mscszSignalBlankControls) .toLocal8Bit().data()); } //Now the widget should be set-up, finalise set-up addNodeToWindow(); cn = QObject::connect(mpobjNode, &clsXMLnode::setData ,this, &clsQtTextEdit::setData); Q_ASSERT_X(cn, clsQtTextEdit::metaObject()->className() ,QString("Cannot connect %1!").arg(clsXMLnode::mscszSignalSetData) .toLocal8Bit().data()); } /** * @brief clsQtTextEdit::blankControl */ void clsQtTextEdit::blankControl() { setData(""); } /** * @brief clsQtTextEdit::blnValidSignal * @param strSignal : The signal to validate * @return true if the signal is valid else false */ bool clsQtTextEdit::blnValidSignal(QString strSignal) { return clsXMLinterface::blnValidSignal(&clsQtTextEdit::mscmpSignals, strSignal); } /** * @brief clsQtTextEdit::objGetData * @param pstrValue : Optional, pointer return value as string * @return Current text from control */ QJsonObject clsQtTextEdit::objGetData(QString* pstrValue) { QString strValue(strGetData()); QJsonObject objJSON; objJSON.insert(clsXMLnode::mscszAttrText, strValue); if ( pstrValue != nullptr ) { *pstrValue = strValue; } return objJSON; } /** * @brief clsQtTextEdit::rptrCopyAvailable * @param blnYes : boolean yes = true else false */ void clsQtTextEdit::rptrCopyAvailable(bool blnYes) { QJsonObject objJSON; if ( mpobjNode->blnCheckSubscribers(clsQtTextEdit::mscszQtSignalCopyAvailable ,&objJSON) == true ) { QJsonObject objParam; objParam["yes"] = blnYes; objJSON[clsXMLnode::mscszAttrParameters] = objParam; emit mpobjNode->commonRptdSignal(objJSON); } } /** * @brief clsQtTextEdit::rptrCurrentCharFormatChanged * @param format : format information */ void clsQtTextEdit::rptrCurrentCharFormatChanged(const QTextCharFormat& format) { QJsonObject objJSON; if ( mpobjNode->blnCheckSubscribers(clsQtTextEdit::mscszQtSignalCurrentCharFormatChanged ,&objJSON) == true ) { QJsonObject objParam; //objParam["format"] = format; objJSON[clsXMLnode::mscszAttrParameters] = objParam; emit mpobjNode->commonRptdSignal(objJSON); } (void)format; } /** * @brief clsQtTextEdit::rptrCursorPositionChanged */ void clsQtTextEdit::rptrCursorPositionChanged() { QJsonObject objJSON; if ( mpobjNode->blnCheckSubscribers(clsQtTextEdit::mscszQtSignalCursorPositionChanged ,&objJSON) == true ) { QJsonObject objParam; QCursor curPos = cursor(); QPoint ptCursor = curPos.pos(); objParam[clsXMLnode::mscszAttrX] = ptCursor.x(); objParam[clsXMLnode::mscszAttrY] = ptCursor.y(); objJSON[clsXMLnode::mscszAttrParameters] = objParam; emit mpobjNode->commonRptdSignal(objJSON); } } /** * @brief clsQtTextEdit::rptrRedoAvailable * @param blnAvailable : boolean yes = true else false */ void clsQtTextEdit::rptrRedoAvailable(bool blnAvailable) { QJsonObject objJSON; if ( mpobjNode->blnCheckSubscribers(clsQtTextEdit::mscszQtSignalRedoAvailable ,&objJSON) == true ) { QJsonObject objParam; objParam[clsXMLnode::mscszAttrAvailable] = blnAvailable; objJSON[clsXMLnode::mscszAttrParameters] = objParam; emit mpobjNode->commonRptdSignal(objJSON); } } /** * @brief clsQtTextEdit::rptrSelectionChanged */ void clsQtTextEdit::rptrSelectionChanged() { QJsonObject objJSON; if ( mpobjNode->blnCheckSubscribers(clsQtTextEdit::mscszQtSignalSelectionChanged ,&objJSON) == true ) { emit mpobjNode->commonRptdSignal(objJSON); } } /** * @brief clsQtTextEdit::rptrTextChanged */ void clsQtTextEdit::rptrTextChanged() { QJsonObject objJSON(mpobjNode->makeJSONresponse(clsQtTextEdit::mscszQtSignalTextChanged)); const QString cstrText(strGetData()); objJSON[clsXMLnode::mscszAttrData] = cstrText; emit mpobjNode->commonRptdSignal(objJSON); setData(cstrText); } /** * @brief clsQtTextEdit::rptrUndoAvailable * @param blnAvailable : boolean yes = true else false */ void clsQtTextEdit::rptrUndoAvailable(bool blnAvailable) { QJsonObject objJSON; if ( mpobjNode->blnCheckSubscribers(clsQtTextEdit::mscszQtSignalUndoAvailable ,&objJSON) == true ) { QJsonObject objParam; objParam[clsXMLnode::mscszAttrAvailable] = blnAvailable; objJSON[clsXMLnode::mscszAttrParameters] = objParam; emit mpobjNode->commonRptdSignal(objJSON); } } /** * @brief clsQtTextEdit::setData * @param crstrData : Constant reference to data string * @param blnPush : Optional true to push change */ void clsQtTextEdit::setData(const QString& crstrData, bool blnPush) { //Get the ID QString strID(mpobjNode->strGetAttribute(clsXMLnode::mscszAttrID)); if ( strID.isEmpty() == true ) { return; } if ( blnPush == true ) { QJsonObject objData; int intPosition; objData.insert(strID, crstrData); if ( (intPosition = intPush(objData)) >= 0 ) { mpobjNode->mpobjXMLIF->setPosition(intPosition); } } bool blnBlock(QTextEdit::blockSignals(true)); QString strCurrent(QTextEdit::toPlainText()); if ( strCurrent.compare(crstrData) != 0 ) { //QCursor cursor(this->cursor()); QTextCursor cursor(textCursor()); int intPosition(cursor.position()); QTextEdit::setText(crstrData); cursor.setPosition(intPosition); setTextCursor(cursor); //this->setCursor(cursor); } QTextEdit::blockSignals(blnBlock); clsXMLinterface::setData(crstrData, blnPush); } /** * @brief clsQtTextEdit::setProperty * @param strProperty : The property name * @param strValue : Value to assign to property */ void clsQtTextEdit::setProperty(QString strProperty, QString strValue) { if ( strProperty.compare(clsXMLnode::mscszPropertyCursorWidth) == 0 ) { setCursorWidth(strValue.toInt()); } else if ( strProperty.compare(clsXMLnode::mscszPropertyOverwrite) == 0 ) { bool blnOverwrite; if ( strValue.compare(clsXMLnode::mscszTrue) == 0 ) { blnOverwrite = true; } else { blnOverwrite = false; } setOverwriteMode(blnOverwrite); } else if ( strProperty.compare(clsXMLnode::mscszPropertyReadOnly) == 0 ) { bool blnReadOnly; if ( strValue.compare(clsXMLnode::mscszTrue) == 0 ) { blnReadOnly = true; } else { blnReadOnly = false; } setReadOnly(blnReadOnly); } else if ( strProperty.compare(clsXMLnode::mscszPropertyRichText) == 0 ) { bool blnRichText; if ( strValue.compare(clsXMLnode::mscszTrue) == 0 ) { blnRichText = true; } else { blnRichText = false; } setAcceptRichText(blnRichText); } } /** * @brief clsQtTextEdit::setText * @param crstrText : Constant reference to text to use */ void clsQtTextEdit::setText(const QString& crstrText) { setData(crstrText); } /** * @brief clsQtTextEdit::strGetData * @return Text trimmed of whitespace */ QString clsQtTextEdit::strGetData() { return toPlainText().trimmed(); }
-
S SPlatten has marked this topic as solved on