crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QLineEdit для ввода IP-адреса, Создания виджета для ввода IPv4-адреса
l0rdex
  опции профиля:
сообщение 20.8.2013, 10:21
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 2.8.2013
Пользователь №: 3894

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день!
Программа для редактирования настроек сетевых настроек маршрутизатора.
Создал поле для ввода IP-адреса с помощью QLineEdit. Ограничил его маской:
ui->lineEdit_Plain_IP->setInputMask(">990.990.990.999");

Все вроде бы неплохо, но редактирование неудобно для пользователя. Хотелось бы еще ограничить внятным валидатором, но когда я его пишу:
    
QString Octet = "(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])";
ui->lineEdit_Plain_IP->setValidator(new QRegExpValidator(QRegExp("^" + Octet + "\\." + Octet + "\\." + Octet + "\\." + Octet + "$"), this));

то вместе с маской он не работает (ничего не вводится).
Очень хотелось бы, чтоб поле ввода было как в windows (автоматический переход в следующий октет, удаление всей строки delete&backspace, диапазон в приделах [0-255]). Искал в паутине - ничего внятного не нашел. Помогите, плз!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 25.8.2013, 23:21
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


попробуй создать отдельную переменную указывающую на валидатор, и воспользуйся методом validate(), чтобы проверить работу валидатора.
На мой взгляд Регулярка правильно составлена
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
l0rdex
  опции профиля:
сообщение 28.8.2013, 15:06
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 2.8.2013
Пользователь №: 3894

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 25.8.2013, 23:21) *
попробуй создать отдельную переменную указывающую на валидатор, и воспользуйся методом validate(), чтобы проверить работу валидатора.
На мой взгляд Регулярка правильно составлена

Пробовал - не помогло :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.8.2013, 19:42
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(l0rdex @ 28.8.2013, 17:06) *
Пробовал - не помогло
что возвращает метод validate()?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
l0rdex
  опции профиля:
сообщение 6.9.2013, 11:23
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 2.8.2013
Пользователь №: 3894

Спасибо сказали: 0 раз(а)




Репутация:   0  


Валидатор не работал из-за маски. Если не ставить маску, то все классно работает, только точки приходится ставить руками.
Сейчас я думаю идти какими путями. Либо подружить маску с валидатором, хотя люди говорят, что вместе они не работают. Либо создавать отдельные 4 поля для ввода в каждом октете и потом их объеденять.
Мож кто что посоветует?

И еще вопрос: когда ставлю маску, то выделение идет по символам, а не стоит курсор между символами. как сделать, чтоб курсор был как в обычном поле для ввода текста?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 6.9.2013, 13:57
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


l0rdex, я в своё время экспериментировал с окном ввода IP адреса (не в Qt, правда, но тут разницы нет). Всяко оно неудобно - а с умным валидатором и того хуже, так как человеку больше возни с вводом - надо прыгать по окошкам (в случае 4 окон) либо упираться в нестираемые точки

и... оставил вариант с самым простым окном ввода. Человек может вводить IP не глядя на экран, поэтому вместо точек там может появиться одно из ",б<юЮ>/?" - кто во что горазд. Поэтому, после подтверждения сохранения, я смотрю - если первый символ цифра, то считаю, что введён IP адрес и заменяю все приведённые в кавычках символы на точку. Иначе - оставляю как есть, так как это мог быть введён обычный адрес, а не IP

в итоге - появляется возможность принимать не только IP, но и "привычный" адрес. Хранить, само собой, нужно тоже в текстовом виде
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.9.2013, 17:35
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(l0rdex @ 6.9.2013, 13:23) *
И еще вопрос: когда ставлю маску, то выделение идет по символам, а не стоит курсор между символами. как сделать, чтоб курсор был как в обычном поле для ввода текста?
скорее всего никак. При наличии маски ввод идёт как при включенном режиме замещения символов (клавиша Insert на клавиатуре)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
l0rdex
  опции профиля:
сообщение 10.9.2013, 12:00
Сообщение #8


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 2.8.2013
Пользователь №: 3894

Спасибо сказали: 0 раз(а)




Репутация:   0  


В общем решил пойти самым трудным и нелегким путем. Не взерая на то что программа немаленькая и уже выпущена, завьязана везде на полях QLineEdit (а для ввода IP-адресов у меня 8 разных полей в различных местах), плюнул на все и решил сделать человечно. В общем я разбил свой QLineEdit на 4 таких же, ограничив каждый из них валидатором. При изменении октета текст с него копируется в QString октета и зразу же в QString всего поля IP-адреса:
void MainWindow::on_qleLanIP_oct1_textChanged(const QString &arg1)
{
    qsLanIP_oct1 = ui->qleLanIP_oct1->text();
    qsLanIP = qsLanIP_oct1 + "." + qsLanIP_oct2 + "." + qsLanIP_oct3 + "." + qsLanIP_oct4;
}


В результате получаю:
Цитата
Debugging starts
LanIP= "192.168.3.1"
Debugging has finished


Все гуд :rolleyes: дальше в программе я уже работаю с переменной qsLanIP и уже начал радоватся, но вот у меня еще есть функция сохранения/открытия конфигурации при помощи xml. Если раньше я считывал файл и сразу подставлял значение в поле для ввода ip-адреса
 else if(xmlPionData.name() == "WAN")
                    {
                        while(!xmlPionData.atEnd())
                        {
                            if(xmlPionData.isEndElement())
                            {
                                xmlPionData.readNext();
                                break;
                            }
                            else if(xmlPionData.name() == "IP")
                            {
                                ui->lineEdit_Crypt_IP->setText(xmlPionData.readElementText());
                                xmlPionData.readNext();
                            }
                         }
}
}...
, то сейчас мне считать текст с xml, найти запись между тегами <IP>192.168.1.110</P>, присвоить его переменной qsLanIP, потом как-то в этой переменной значение от начала до симова "." вставить в первый октет, потом от второй точки до третей во второй и т.д.
Может кто знает как это изящно сделать? :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
l0rdex
  опции профиля:
сообщение 10.9.2013, 16:09
Сообщение #9


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 2.8.2013
Пользователь №: 3894

Спасибо сказали: 0 раз(а)




Репутация:   0  


Решил проблему в предвидущем посте:
while(!xmlPionData.atEnd())
            {
                if(xmlPionData.isStartElement())
                {
                    if(xmlPionData.name() == "LAN")
                    {
                        while(!xmlPionData.atEnd())
                        {
                            if(xmlPionData.isEndElement())
                            {
                                xmlPionData.readNext();
                                break;
                            }
                            else if(xmlPionData.name() == "IP")
                            {
                                qsLanIP = xmlPionData.readElementText();
                                QStringList qslLanIP = qsLanIP.split(QRegExp("\\."));
                                ui->qleLanIP_oct1->setText(qslLanIP.at(0));
                                ui->qleLanIP_oct2->setText(qslLanIP.at(1));
                                ui->qleLanIP_oct3->setText(qslLanIP.at(2));
                                ui->qleLanIP_oct4->setText(qslLanIP.at(3));

                                qDebug() << "qslLanIP= " << qslLanIP << "\n";
                                //while(xmlPionData.name() =! ".")
                                    //ui->qleLanIP_oct2->setText(xmlPionData.readElementText());
                                xmlPionData.readNext();
                            }...

Осталось поставить ивент фильтры для перехода между октетами точкой или стрелочками. и можно сказать все)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
l0rdex
  опции профиля:
сообщение 2.10.2013, 12:43
Сообщение #10


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 2.8.2013
Пользователь №: 3894

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доделал я эти поля. Не знаю, может и выглядит код не совсем правильно, но уж как есть, работает отлично. Решил поделиться как я делал одно из полей. Может кому-то будет полезно...

1) в дизайнере добавил 4 QLineEdit
2) между ними поставил точки с помощью QLabel
3) потом в описании класса установил фильтры событий на каждый октет
ui->qleUDPConnIP_oct1->installEventFilter(this);
    ui->qleUDPConnIP_oct2->installEventFilter(this);
    ui->qleUDPConnIP_oct3->installEventFilter(this);
    ui->qleUDPConnIP_oct4->installEventFilter(this);

4) после чего добавил регулярное выражение и поставил валидатор
QRegExp rx ( "^(0|[1-9]|[1-9][0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))$" );
    QValidator *validator = new QRegExpValidator(rx, this);
  
    ui->qleUDPConnIP_oct1->setValidator(validator);
    ui->qleUDPConnIP_oct2->setValidator(validator);
    ui->qleUDPConnIP_oct3->setValidator(validator);
    ui->qleUDPConnIP_oct4->setValidator(validator);

5) изначально при открытии формы, в поля подставляется ip-адрес, с которым мы работали до этого. Храниться у меня в переменной sysSettings.qsConnIp в виде "192.168.1.1". Потому нужно ее разбить на 4 октета:
QStringList qslUDPConnIP = sysSettings.qsConnIp.split(QRegExp("\\."));
    ui->qleUDPConnIP_oct1->setText(qslUDPConnIP.at(0));
    ui->qleUDPConnIP_oct2->setText(qslUDPConnIP.at(1));
    ui->qleUDPConnIP_oct3->setText(qslUDPConnIP.at(2));
    ui->qleUDPConnIP_oct4->setText(qslUDPConnIP.at(3));
    ui->lineEdit_port->setText(sysSettings.qsConnPort);

6) Птом собственно описываем evetФильтры:
Раскрывающийся текст
bool ConnectUDP::eventFilter(QObject *target, QEvent *kevent)
{
    if(kevent->type() == QEvent::KeyPress)
    {
        QKeyEvent *keyEvent = dynamic_cast<QKeyEvent *>(kevent);
        if(keyEvent)
        {
            //F O R W A R D :
            if(target == ui->qleUDPConnIP_oct1 ||
                    target == ui->qleUDPConnIP_oct2 ||
                    target == ui->qleUDPConnIP_oct3)
            {
                switch(keyEvent->key())
                {
                case Qt::Key_Period:
                    focusNextChild();
                    return true;
                    break;

                case Qt::Key_Comma:
                    focusNextChild();
                    return true;
                    break;

                case Qt::Key_Right:
                    if(target == ui->qleUDPConnIP_oct1)
                    {
                        if(ui->qleUDPConnIP_oct1->text().isEmpty() ||
                                (ui->qleUDPConnIP_oct1->text().size() == ui->qleUDPConnIP_oct1->cursorPosition()))
                        {
                            ui->qleUDPConnIP_oct2->setFocus();
                            ui->qleUDPConnIP_oct2->setCursorPosition(0);
                        }
                        else break;
                    }
                    else if(target == ui->qleUDPConnIP_oct2)
                    {
                        if(ui->qleUDPConnIP_oct2->text().isEmpty() ||
                                (ui->qleUDPConnIP_oct2->text().size() == ui->qleUDPConnIP_oct2->cursorPosition()))
                        {
                            ui->qleUDPConnIP_oct3->setFocus();
                            ui->qleUDPConnIP_oct3->setCursorPosition(0);
                        }
                        else break;
                                                }
                    else if(target == ui->qleUDPConnIP_oct3)
                    {
                        if(ui->qleUDPConnIP_oct3->text().isEmpty() ||
                                (ui->qleUDPConnIP_oct3->text().size() == ui->qleUDPConnIP_oct3->cursorPosition()))
                        {
                            ui->qleUDPConnIP_oct4->setFocus();
                            ui->qleUDPConnIP_oct4->setCursorPosition(0);
                        }
                        else break;
                    }
                    return true;
                    break;

                case Qt::Key_0:
                    if(target == ui->qleUDPConnIP_oct1)
                    {
                        if(ui->qleUDPConnIP_oct1->text() == "0")
                        {
                            focusNextChild();
                        }
                        else break;
                    }
                    if(target == ui->qleUDPConnIP_oct2)
                    {
                        if(ui->qleUDPConnIP_oct2->text() == "0")
                        {
                            focusNextChild();
                        }
                        else break;
                    }
                    if(target == ui->qleUDPConnIP_oct3)
                    {
                        if(ui->qleUDPConnIP_oct3->text() == "0")
                        {
                            focusNextChild();
                        }
                        else break;
                    }
                    return true;
                    break;

                case Qt::Key_Delete:
                    if(target == ui->qleUDPConnIP_oct1)
                    {
                        if(ui->qleUDPConnIP_oct1->text().isEmpty() ||
                                ui->qleUDPConnIP_oct1->text().size() == ui->qleUDPConnIP_oct1->cursorPosition())
                        {
                            ui->qleUDPConnIP_oct2->setFocus();
                            ui->qleUDPConnIP_oct2->setCursorPosition(0);
                        }
                        else break;
                    }
                    if(target == ui->qleUDPConnIP_oct2)
                    {
                        if(ui->qleUDPConnIP_oct2->text().isEmpty() ||
                                ui->qleUDPConnIP_oct2->text().size() == ui->qleUDPConnIP_oct2->cursorPosition())
                        {
                            ui->qleUDPConnIP_oct3->setFocus();
                            ui->qleUDPConnIP_oct3->setCursorPosition(0);
                        }
                        else break;
                    }
                    if(target == ui->qleUDPConnIP_oct3)
                    {
                        if(ui->qleUDPConnIP_oct3->text().isEmpty() ||
                                ui->qleUDPConnIP_oct3->text().size() == ui->qleUDPConnIP_oct3->cursorPosition())
                        {
                            ui->qleUDPConnIP_oct4->setFocus();
                            ui->qleUDPConnIP_oct4->setCursorPosition(0);
                        }
                        else break;
                    }
                    return true;
                    break;
                default:
                        break;
                }
            }

            //B A C K W A R D :
            if(target == ui->qleUDPConnIP_oct2 ||
                    target == ui->qleUDPConnIP_oct3 ||
                    target == ui->qleUDPConnIP_oct4)
            {
                switch(keyEvent->key())
                {
                case Qt::Key_Left:
                    if(target == ui->qleUDPConnIP_oct4)
                    {
                        if(ui->qleUDPConnIP_oct4->text().isEmpty() ||
                                ui->qleUDPConnIP_oct4->cursorPosition() == 0)
                        {
                            ui->qleUDPConnIP_oct3->setFocus();
                            ui->qleUDPConnIP_oct3->setCursorPosition(ui->qleUDPConnIP_oct3->text().size());
                        }
                        else break;
                    }
                    if(target == ui->qleUDPConnIP_oct3)
                    {
                        if(ui->qleUDPConnIP_oct3->text().isEmpty() ||
                                ui->qleUDPConnIP_oct3->cursorPosition() == 0)
                        {
                            ui->qleUDPConnIP_oct2->setFocus();
                            ui->qleUDPConnIP_oct2->setCursorPosition(ui->qleUDPConnIP_oct2->text().size());
                        }
                        else break;
                    }
                    if(target == ui->qleUDPConnIP_oct2)
                    {
                        if(ui->qleUDPConnIP_oct2->text().isEmpty() ||
                                ui->qleUDPConnIP_oct2->cursorPosition() == 0)
                        {
                            ui->qleUDPConnIP_oct1->setFocus();
                            ui->qleUDPConnIP_oct1->setCursorPosition(ui->qleUDPConnIP_oct1->text().size());
                        }
                        else break;
                    }
                    return true;
                    break;

                case Qt::Key_Backspace:
                    if(target == ui->qleUDPConnIP_oct4)
                    {
                        if(ui->qleUDPConnIP_oct4->text().isEmpty() ||
                                ui->qleUDPConnIP_oct4->cursorPosition() == 0)
                        {
                            ui->qleUDPConnIP_oct3->setFocus();
                            ui->qleUDPConnIP_oct3->setCursorPosition(ui->qleUDPConnIP_oct3->text().size());
                        }
                        else break;
                    }
                    if(target == ui->qleUDPConnIP_oct3)
                    {
                        if(ui->qleUDPConnIP_oct3->text().isEmpty() ||
                                ui->qleUDPConnIP_oct3->cursorPosition() == 0)
                        {
                            ui->qleUDPConnIP_oct2->setFocus();
                            ui->qleUDPConnIP_oct2->setCursorPosition(ui->qleUDPConnIP_oct2->text().size());
                        }
                        else break;
                    }
                    if(target == ui->qleUDPConnIP_oct2)
                    {
                        if(ui->qleUDPConnIP_oct2->text().isEmpty() ||
                                ui->qleUDPConnIP_oct2->cursorPosition() == 0)
                        {
                            ui->qleUDPConnIP_oct1->setFocus();
                            ui->qleUDPConnIP_oct1->setCursorPosition(ui->qleUDPConnIP_oct1->text().size());
                        }
                        else break;
                    }
                    return true;
                    break;

                default:
                    break;
                }
            }
        }
    }

    return QDialog::eventFilter(target, kevent);
}

7) для работы с этим адресом, нужно записать его в переменную. Для этого использовал слоты:
Раскрывающийся текст
void ConnectUDP::on_qleUDPConnIP_oct1_textChanged()
{
    qsUDPConnIP_oct1 = ui->qleUDPConnIP_oct1->text();
    qsUDPConnIP = qsUDPConnIP_oct1 + "." + qsUDPConnIP_oct2 + "." + qsUDPConnIP_oct3 + "." + qsUDPConnIP_oct4;
    if(ui->qleUDPConnIP_oct1->text().size() == MAX_DIGITS &&
            ui->qleUDPConnIP_oct1->text().size() == ui->qleUDPConnIP_oct1->cursorPosition())
    {
        ui->qleUDPConnIP_oct2->setFocus();
        ui->qleUDPConnIP_oct2->selectAll();
    }
}

void ConnectUDP::on_qleUDPConnIP_oct2_textChanged()
{
    qsUDPConnIP_oct2 = ui->qleUDPConnIP_oct2->text();
    qsUDPConnIP = qsUDPConnIP_oct1 + "." + qsUDPConnIP_oct2 + "." + qsUDPConnIP_oct3 + "." + qsUDPConnIP_oct4;
    if(ui->qleUDPConnIP_oct2->text().size() == MAX_DIGITS &&
            ui->qleUDPConnIP_oct2->text().size() == ui->qleUDPConnIP_oct2->cursorPosition())
    {
        ui->qleUDPConnIP_oct3->setFocus();
        ui->qleUDPConnIP_oct3->selectAll();
    }
}

void ConnectUDP::on_qleUDPConnIP_oct3_textChanged()
{
    qsUDPConnIP_oct3 = ui->qleUDPConnIP_oct3->text();
    qsUDPConnIP = qsUDPConnIP_oct1 + "." + qsUDPConnIP_oct2 + "." + qsUDPConnIP_oct3 + "." + qsUDPConnIP_oct4;
    if(ui->qleUDPConnIP_oct3->text().size() == MAX_DIGITS &&
            ui->qleUDPConnIP_oct3->text().size() == ui->qleUDPConnIP_oct3->cursorPosition())
    {
        ui->qleUDPConnIP_oct4->setFocus();
        ui->qleUDPConnIP_oct4->selectAll();
    }
}

void ConnectUDP::on_qleUDPConnIP_oct4_textChanged()
{
    qsUDPConnIP_oct4 = ui->qleUDPConnIP_oct4->text();
    qsUDPConnIP = qsUDPConnIP_oct1 + "." + qsUDPConnIP_oct2 + "." + qsUDPConnIP_oct3 + "." + qsUDPConnIP_oct4;
}


В общем результате получилось следующее:
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 2:35