Como incrementar e decrementar uma string (ip) com Key_UP e DOWN..



  • (Principiante em c++ e Qt) Galera, boa tarde, estou fazendo um sistema aqui. No caso o meu objetivo, por enquanto, e' conseguir pegar um "ip" pronto, e atraves do Key_UP E DOWN, incrementar ou decrementar o numero que o cursor esta' apontando. Se eu jogar p direita com Key_RIGHT e LEFT, o cursor avanca ou retrocede uma posicao da lista string "ip" e por ai vai.. (tudo isso em C++) desculpem a falta de acentos..



  • Olá @MSDiLieto. Seja bem vindo ao Qt Forum.

    Você está utilizando QLineEdit para editar seu IP ?

    Você pode sobreescrever a função keyPressEvent(QKeyEvent *event) em um QLineEdit customizado, e assim, implementar essa ideia de incremento e decremento no Texto IP.



  • #include <QLabel>
    #include "qlabel.h"
    #include <iostream>
    #include "QStringList"
    #include <qstringlist.h>
    #include <QDebug>

    int old;
    int num = old;
    char ip[] = "000.000.000.000";
    int CursorPosition = 0;
    MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    {
    ui->setupUi(this);

    ui->lineEdit->setText(ip);
    ui->lineEdit->setCursorPosition(0);
    

    // ui->lineEdit->cursorPositionChanged();
    connect(ui->lineEdit, SIGNAL(cursorPositionChanged(int,int)), this, SLOT(trataMove(int, int)));
    }

    MainWindow::~MainWindow()
    {
    delete ui;
    }

    //QStringList strings;
    //strings << "line one" << "line two";
    //yourTextEdit->setText(strings.join("\n"));

    void MainWindow::trataMove(int old,int novo) {
    // qDebug() << "MEXI!!" << old << novo;
    qDebug() << ip[novo];
    CursorPosition = novo;
    }

    void MainWindow::keyPressEvent(QKeyEvent * event)
    {
    // QStringList ip = "000.000.000.000";
    // int i = 0;
    qDebug() << event->key();
    if(event->key() == Qt::Key_Up){
    char number = ip[CursorPosition];
    int numero = number - '0';
    numero++;
    ip[CursorPosition] = numero + '0';
    ui->lineEdit->setText(ip);
    qDebug() << CursorPosition;
    CursorPosition++;
    ui->lineEdit->setCursorPosition(ip[CursorPosition]);

    }
    
     if(event->key() == Qt::Key_Down){
        char number = ip[CursorPosition];
        int numero = number - '0';
        numero--;
        ip[CursorPosition] = numero + '0';
        ui->lineEdit->setText(ip);
        qDebug() << CursorPosition;
        CursorPosition++;
        ui->lineEdit->setCursorPosition(ip[CursorPosition]);
    
    
    }
    
     if(event->key() == Qt::Key_Right){
         qDebug() << "sdbfjafhaf";
     }
    

    // if(event->key() == Qt::Key_Right){
    // ui->label->setText("000.000.000.000");
    // for (i = 0; i<=15; i++){
    // ui->lineEdit->setText(ip[3]);
    // }
    //}
    }



  • This post is deleted!


  • E' o que estou fazendo praticamente, mas estao acontecendo que:

    Quando incremento ou decremento, o cursor volta para a posicao 0..
    esse e' o meu codigo, desculpa a falta de orgnizacao, se entender ou faltar algo p vc entender, pode me pedir..
    agradeco desde ja, a resposta e as boas vindas!! ^^


  • @MSDiLieto

    Você pode salvar a antiga posição do cursor e definir a posição atual, então depois de mudar o texto do LineEdit, só é necessário restaurar a posição.

    Segue abaixo um exemplo de como isso poderia ser implementado (utilizando o seu trecho de código):

    #include <QStringList>
    #include <QString>
    #include <QtMath>
    
    QString ip = "000.000.000.000";
    int CursorPosition = 0;
    
    void MainWindow::keyPressEvent(QKeyEvent * event)
    {
        if(event->key() == Qt::Key_Up || event->key() == Qt::Key_Down){
            // Se estiver no caracter nulo da String ou estiver em um delimitador, então anule a ação
            if(CursorPosition == ip.count()) return;
            if(ip.at(CursorPosition) == '.' ) return;
    
            // Quebrar IP String em segmentos de strings [0] 000 [1] 000 [2] 000 [3] 000
            QStringList ipSplitted = ip.split('.');
    
            // Calculando as Posições
            const int sectionPos = CursorPosition / 4;
            const int characterPos = CursorPosition % 4;
    
            // Selecionar a sentença e converter para Inteiro
            int ipNumber = ipSplitted.at(sectionPos).toInt();
    
            // Subtrair ou Somar 10^posição
            if(event->key() == Qt::Key_Up){
                ipNumber += pow(10, (2-characterPos));
                if(ipNumber > 255) ipNumber = 255;
            }
            else{
                ipNumber -= pow(10, (2-characterPos));
                if(ipNumber < 0) ipNumber = 0;
            }
    
            // Inserir Nova Sentença de IP
            QString ipSentence;
            ip.replace(sectionPos * 4, 3, ipSentence.sprintf("%03d", ipNumber));
    
            // Inserir String no LineEdit e restaurando posição do Cursor
            const int restorePosition = CursorPosition;
            ui->lineEdit->setText(ip);
            ui->lineEdit->setCursorPosition(restorePosition);
        }
    }
    


  • Muito obrigado mesmo meu amigo! A unica coisa q adicionei para dar certo foi:

    void MainWindow::keyPressEvent(QKeyEvent * event)
    {
        **CursorPosition = ui->lineEdit->cursorPosition();**
        if(event->key() == Qt::Key_Up || event->key() == Qt::Key_Down){
            // Se estiver no caracter nulo da String ou estiver em um delimitador, então anule a ação
            if(CursorPosition == ip.count()) return;
            if(ip.at(CursorPosition) == '.' ) return;
    


  • @KillerSmath
    E se for uma string "numerica", q incremente no mesmo esquema, tipo:

    numeric = 000000
    000001, 000002, 000009, 000010...



  • @MSDiLieto
    QSpinBox implementa essa ideia de incrementar e decrementar valores utilizando os teclas de Key_UP e Key_Down.
    Porém como você pretende exibir uma string do tipo 0000001 ao invés de 1 então é necessário sobrecarregar o método textFromValue

    https://stackoverflow.com/questions/26537473/qdoublespinbox-with-leading-zeros-always-4-digits/26538572#26538572

    Por fim, promova a sua nova classe para uma QSpinBox normal, dessa forma ao invés da sua interface utilizar um QSpinBox comum, ela passará a utilizar sua classe.

    https://forum.qt.io/topic/102343/how-to-get-promoted-widget-to-show/2



  • @KillerSmath
    Nossa cara, me ajudou mt, tava dando certo aqui, mas quem esta' pedindo, quer no mesmo formato do QLineEdit.. tem como?



  • @MSDiLieto
    Sim, você pode incorporar o comportamento que quiser desde que a função seja virtual. Faça isso diretamente em um QLineEdit ou simplemente rescreva essa ideia com base no QSpinBox.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.