wie Qt::Key zu QString?

Alles rund um die Programmierung mit Qt
Antworten
MADsCIENTIST

wie Qt::Key zu QString?

Beitrag von MADsCIENTIST »

Hallo,

ich benötige die Möglichkeit einen Qt::Key in einen QString umzuwundeln. - Habe das keyPressEvent von einem QPlainTextEdit überschrieben
und muss nun die Tasten des Alphabets, der Zahlen und der Sonderzeichen behandeln.
Wie geht das?

Bedanke mich für sinnvolle Hilfe schon mal im Voraus.
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: wie Qt::Key zu QString?

Beitrag von veeman »

Warum nutzt du nicht einfach QString QKeyEvent::text()?
MADsCIENTIST

Re: wie Qt::Key zu QString?

Beitrag von MADsCIENTIST »

Weil ich mit keyPressedEvent und keyReleasedEvent für eigene Tastenkombinationen arbeite!
Außerdem werden bei mir dadurch unter anderem manche Keys nicht korrekt dargestellt, z. B. bei 'ü' => ''³'!

Dieses Problem hat sich schon durch den Einsatz von switch-cases erledigt :wink:
cbob
Beiträge: 6
Registriert: 13. Oktober 2011 13:30

Re: wie Qt::Key zu QString?

Beitrag von cbob »

Versuch mal folgendes:

QChar::fromAscii(Qt::Key_B)

Dann hats zumindest n Char...
gibt auch n QString::fromAscii, aber den hab ich nciht versucht.
MasterK
Beiträge: 24
Registriert: 10. November 2009 23:10

Re: wie Qt::Key zu QString?

Beitrag von MasterK »

Qt:Key ist ein QMetaEnum, damit kannst du dir den Namen eines Enum Wertes ganz einfach holen.

Und switch-case ist in solchen Fällen meistens *bäh* ;)
MADsCIENTIST

Re: wie Qt::Key zu QString?

Beitrag von MADsCIENTIST »

Ja, das mit den switch-cases finde ich bis jetzt auch sehr umständlich und nimmt auch sehr viel Quellcode
ein. Bei mir sind das jetzt schon circa 301 Codezeilen!

Ich benötige die Erfassung verschiedener Keykombinationen, z. B. "CTRL" + "A" oder "SHIFT" + "RETURN",
aber auch z. B. "CTRL" + "SHIFT" + "A", etc.

Das frage ich derzeit über einen keyPressEvent Filter ab:

Code: Alles auswählen

void MessageInput::keyPressEvent(QKeyEvent* event) {
	if( ((event->modifiers() & Qt::ShiftModifier) == Qt::ShiftModifier) ) {
		
		// On "SHIFT" + "RETURN"
		if(event->key() == Qt::Key_Return) {
			// do something			
		}
	}

	// and so on
}
Kann man auch irgendwie einfacher verschiedene Tastenkombinationen und die darauf folgenden Aktionen
einstellen?

Und muss man wirklich gleich ein neues keyPressEvent hinzufügen, nur um neue Shortcuts zu definieren?
Zuletzt geändert von MADsCIENTIST am 10. April 2013 23:08, insgesamt 1-mal geändert.
MasterK
Beiträge: 24
Registriert: 10. November 2009 23:10

Re: wie Qt::Key zu QString?

Beitrag von MasterK »

Ja, du kannst QKeySequence benutzen um beliebige Tastenkombinationen zu definieren.

Das geschickt genutzt in Kombination mit einem Signal emittenden Objekt und Ausnutzen der Reflektion Funktionalität von Qt und du kannst recht fix beliebig viele Tastenkombinationen in definierte Slots münden lassen.
MADsCIENTIST

Re: wie Qt::Key zu QString?

Beitrag von MADsCIENTIST »

Wie genau melde ich denn die Shortcuts beim QPlainTextEdit Objekt an?

Habe folgendes im Konstruktor versucht, jedoch wird die Funktion nicht aufgerufen:

Code: Alles auswählen

// Set key combinations
QShortcut* shortcut = new QShortcut(QKeySequence("Shift+Return"), this);
connect( shortcut, SIGNAL(activated()), this, SLOT(setNewLine()) );
MasterK
Beiträge: 24
Registriert: 10. November 2009 23:10

Re: wie Qt::Key zu QString?

Beitrag von MasterK »

Sieht jetzt eigentlich nicht falsch aus. setNewLine() ist auch ein Slot, ja? :)
MADsCIENTIST

Re: wie Qt::Key zu QString?

Beitrag von MADsCIENTIST »

Ja.

Code: Alles auswählen

private slots:
	void setNewLine() {
		std::cout << "BAZINGA" << std::endl;
	}
Er scheint meine Eingabe "SHIFT" + "RETURN" gar nicht wahrzunehmen. Er geht immer nur
in eine neue Zeile!

Zur Zeit habe ich es so bewerkstelligt:

Code: Alles auswählen

void MessageInput::keyPressEvent(QKeyEvent* event) {
	
	// For letters (upper- and lowercase)
	if( ((event->modifiers() & Qt::ShiftModifier) == Qt::ShiftModifier) &&
		(event->key() >= Qt::Key_A && event->key() <= Qt::Key_Z ||
		event->key() == Qt::Key_Adiaeresis || event->key() == Qt::Key_Odiaeresis ||
		event->key() == Qt::Key_Udiaeresis)) {
			
		if( !((event->modifiers() & Qt::ShiftModifier) == Qt::ShiftModifier) )
			this->insertPlainText( QChar::fromAscii( event->key() ).toLower() );
		else
			this->insertPlainText( QChar::fromAscii( event->key() ) );

	}
	// For remaining keys
	else {

		// For keys and key combinations
		// On "SHIFT" + "RETURN": Insert new line
		// On			"RETURN": Send message
		if(event->key() == Qt::Key_Return) {

			if( ((event->modifiers() & Qt::ShiftModifier) == Qt::ShiftModifier ) )
				this->insertPlainText("\n");
			else
				emit sendMessageSignal();

		}
		// On "DELETE" or "BACKSPACE": Delete content (selected or character before cursor)
		else if( event->key() == Qt::Key_Delete || event->key() == Qt::Key_Backspace ) {

			QTextCursor cursor = this->textCursor();
			// Delete the character before the current cursor
			// position (if no selection) or delete selected text
			if(cursor.hasSelection())
				cursor.deleteChar();
			else {
				if(!cursor.atStart())
					cursor.deletePreviousChar();
			}
			this->setTextCursor(cursor);

		}
		// On "KEY_UP" or "PAGE_UP": Move cursor upwards
		else if( event->key() == Qt::Key_Up || event->key() == Qt::Key_PageUp ) {

			QTextCursor cursor = this->textCursor();
			if(!cursor.atStart()) {
				cursor.movePosition(QTextCursor::Up);
				this->setTextCursor(cursor);
			}

		}
		// On "KEY_DOWN" or "PAGE_DOWN": Move cursor downwards
		else if( event->key() == Qt::Key_Down || event->key() == Qt::Key_PageDown ) {

			QTextCursor cursor = this->textCursor();
			if(!cursor.atEnd()) {
				cursor.movePosition(QTextCursor::Down);
				this->setTextCursor(cursor);
			}

		}
		// On "KEY_LEFT": Move cursor to the left
		else if( event->key() == Qt::Key_Left ) {

			QTextCursor cursor = this->textCursor();
			if(!cursor.atStart()) {

				if(cursor.atBlockStart()) {
					cursor.movePosition(QTextCursor::PreviousBlock);
					cursor.movePosition(QTextCursor::EndOfBlock);
				} else {
					cursor.movePosition(QTextCursor::Left);
				}

				this->setTextCursor(cursor);

			}

		}
		// On "KEY_RIGHT": Move cursor to the right
		else if( event->key() == Qt::Key_Right ) {

			QTextCursor cursor = this->textCursor();
			if(!cursor.atEnd()) {

				if(cursor.atBlockEnd()) {
					cursor.movePosition(QTextCursor::NextBlock);
					cursor.movePosition(QTextCursor::StartOfBlock);
				} else {
					cursor.movePosition(QTextCursor::Right);
				}

				this->setTextCursor(cursor);

			}

		}
		// On "CTRL" + "A": Select content
		else if( ((event->modifiers() & Qt::ControlModifier) == Qt::ControlModifier) &&
				 event->key() == Qt::Key_A) {

				emit this->selectAll();

		}
		// On "CTRL" + "C": Copy content
		else if( ((event->modifiers() & Qt::ControlModifier) ==  Qt::ControlModifier) &&
				 event->key() == Qt::Key_C) {

				emit this->copy();

		}
		// On "CTRL" + "V" or "INSERT": Paste content
		else if( (((event->modifiers() & Qt::ControlModifier) ==  Qt::ControlModifier) &&
				 event->key() == Qt::Key_V) || event->key() == Qt::Key_Insert ) {

				emit this->paste();

		}
		// On "CTRL" + "Z": Undo
		else if( ((event->modifiers() & Qt::ControlModifier) ==  Qt::ControlModifier) &&
			event->key() == Qt::Key_Z) {

				emit this->undo();

		}
		// On "CTRL" + "Y": Redo
		else if( ((event->modifiers() & Qt::ControlModifier) ==  Qt::ControlModifier) &&
			event->key() == Qt::Key_Y) {

				emit this->redo();

		}
		// For additional characters
		else {

			// Just if no "SHIFT", "CAPSLOCK", "TAB", "STRG", "ALT", etc.
			if( !(event->key() >= Qt::Key_F1 && event->key() <= Qt::Key_F31) &&
				event->key() != Qt::Key_Print &&
				event->key() != Qt::Key_Pause &&
				event->key() != Qt::Key_End &&
				event->key() != Qt::Key_Alt &&
				event->key() != Qt::Key_AltGr &&
				event->key() != Qt::Key_NumLock &&
				event->key() != Qt::Key_Control &&
				event->key() != Qt::Key_Shift &&
				event->key() != Qt::Key_CapsLock) {

				this->insertPlainText( QChar::fromAscii( event->key() ) );
				std::cout << event->key() << std::endl;

			}

		}

	}

}
Wie stellt man jetzt richtig eigene Tastekombinationen innerhalb eines QTableWidget ein?
Antworten