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