Как обновить QLabel при нажатии различных пронумерованных кнопок - PullRequest
0 голосов
/ 06 мая 2019

У меня есть клавиатура с номерами 1-9 и 0, и над ней QLabel для отображения цифр при нажатии (аналогично клавиатуре на любом телефоне). Все кнопки. Какой самый простой способ заставить QLabel показывать цифры при нажатии кнопок?

Например, если щелкнуть 2, а затем 0, а затем 7, метка будет обновляться в режиме реального времени с 207. Формат Qlabel должен соответствовать стандартным телефонным номерам 000-000-0000. Я понимаю, как установить текст для одного номера за раз, но они продолжают перекрывать друг друга. Любая помощь приветствуется. Заранее спасибо

Ответы [ 4 ]

2 голосов
/ 06 мая 2019

То, что вы ищете, это QSignalMapper.Он отображает несколько входов через единый интерфейс и отправляет вам отправителя.

   QSignalMapper *mapper(new QSignalMapper(parent));
   for (int i=0; i<10; ++i){
       QPushButton *button = some_new_button_function();
       connect(button, &QPushButton::clicked, mapper, &QSignalMapper::map);
       mapper->setMapping(button, i);
   }
   connect(mapper, QOverload<int>::of(&QSignalMapper::mapped), 
           [this](int i){/*here your append code*/});
1 голос
/ 06 мая 2019

Самый простой способ - подключить сигнал кнопок clicked к слоту (возможно, к лямбде), который изменяет текст QLabel (используя setText()).Если вы хотите добавить к текущему тексту, просто сделайте setText(label.text() + "new text");.

0 голосов
/ 07 мая 2019

QLineEdit может лучше соответствовать вашим потребностям в этом случае, если вы также хотите, чтобы ваше представление данных соответствовало стандарту номера телефона, например «000-000-0000». Вы можете сделать его доступным только для чтения, отключить флаги взаимодействия, если хотите (но с точки зрения UI / UX лучше этого не делать, так как в большинстве случаев нет причин запрещать копирование), а также вы можете установить input mask тебе нравится. Учитывая текущую ситуацию, вы можете основывать свои потребности на следующем примере:

// Set your format.
ui->lineEdit->setInputMask("000-000-0000");

// Make sure that your text would be in the format you like initially.
ui->lineEdit->setText("999-999-9999");

// Text will be not editable.
ui->lineEdit->setReadOnly(true);

// And here, you can use QSignalMapper as other members have suggested. Or you can just connect multiple buttons somehow. The choice is yours to make.
connect(ui->pushButton, &QPushButton::clicked, ui->lineEdit, [this]
{
    // Just keep in mind taht when returning text, some of the mask elements might be here, too.
    ui->lineEdit->setText(ui->lineEdit->text().replace("-", "") + "1");
});
0 голосов
/ 06 мая 2019

Вы должны подключить сигналы clicked(), излучаемые каждым QPushButton, к слоту, который обновляет текст QLabel.

Краткий пример

В родительском конструкторе:

connect(qpb1, &QPushButton::clicked, this, &MyClass::handleQLabel);

И возможная реализация слота:

void MyClass::handleQLabel()
{
    QPushButton * qpb = qobject_cast<QPushButton*>(sender()); // Find the sender of the signal
    if(qpb != nullptr)
        this->myLabel->setText(qpb->text()); // Write anything you want in the QLabel
    else
    {
        // Do what you want.
    }
}

Это сделает работу.

Конечно, если вы не хотите использовать sender() (например, для многопоточности), вы можете либо создать один слот с помощью QPushButton и сделать такое же количество connect (тяжелый и довольно грязный обходной путь). ) или создайте подкласс QPushButton, чтобы добавить настраиваемый сигнал для генерации с идентификатором QPushButton и получить его со слотом, например.

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...