繁体   English   中英

单击各种数字按钮后如何更新QLabel

[英]How to have QLabel update as various numbered pushbuttons are clicked

我有一个拨号盘,其数字为1-9和0,上方有一个QLabel,可在单击时显示数字(与任何电话上的小键盘相同)。 全部都是按钮。 使QLabel在单击按钮时显示数字的最简单方法是什么?

例如,如果单击2,然后单击0,然后单击7,则标签将实时更新为207。Qlabel的格式应遵循标准电话号码000-000-0000。 我知道如何一次将setText设置为一个数字,但它们始终相互覆盖。 任何帮助表示赞赏。 先感谢您

您正在寻找的是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*/});

最简单的方法是将按钮的clicked信号连接到更改QLabel文本的插槽(可能是lambda)(使用setText() )。 如果要追加到当前文本,则只需执行setText(label.text() + "new text");

您必须将每个QPushButton发出的clicked()信号连接到更新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 (繁重而又肮脏的解决方法),或者创建一个subclass QPushButton添加一个自定义信号以使用QPushButton的标识符进行发射,并通过一个插槽获取它。

我希望它可以帮助:)

如果您还希望数据表示遵循电话号码标准(例如“ 000-000-0000”),则QLineEdit可能会更适合您的需求。 您可以将其设置为只读,如果愿意,可以禁用交互标志(但是从UI / UX角度来看,最好不要这样做,因为大多数情况下没有理由禁止复制),还可以设置所需的输入掩码 根据当前情况,您可以基于以下示例来满足您的需求:

// 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");
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM