wie Qt::Key zu QString?
wie Qt::Key zu QString?
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.
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.
Re: wie Qt::Key zu QString?
Warum nutzt du nicht einfach QString QKeyEvent::text()?
Re: wie Qt::Key zu QString?
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
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
Re: wie Qt::Key zu QString?
Versuch mal folgendes:
QChar::fromAscii(Qt::Key_B)
Dann hats zumindest n Char...
gibt auch n QString::fromAscii, aber den hab ich nciht versucht.
QChar::fromAscii(Qt::Key_B)
Dann hats zumindest n Char...
gibt auch n QString::fromAscii, aber den hab ich nciht versucht.
Re: wie Qt::Key zu QString?
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*
Und switch-case ist in solchen Fällen meistens *bäh*
Re: wie Qt::Key zu QString?
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:
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?
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
}
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.
Re: wie Qt::Key zu QString?
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.
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.
Re: wie Qt::Key zu QString?
Wie genau melde ich denn die Shortcuts beim QPlainTextEdit Objekt an?
Habe folgendes im Konstruktor versucht, jedoch wird die Funktion nicht aufgerufen:
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()) );
Re: wie Qt::Key zu QString?
Sieht jetzt eigentlich nicht falsch aus. setNewLine() ist auch ein Slot, ja?
Re: wie Qt::Key zu QString?
Ja.
Er scheint meine Eingabe "SHIFT" + "RETURN" gar nicht wahrzunehmen. Er geht immer nur
in eine neue Zeile!
Zur Zeit habe ich es so bewerkstelligt:
Wie stellt man jetzt richtig eigene Tastekombinationen innerhalb eines QTableWidget ein?
Code: Alles auswählen
private slots:
void setNewLine() {
std::cout << "BAZINGA" << std::endl;
}
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;
}
}
}
}