簡體   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