[英]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.