gpt4 book ai didi

C++ Qt : is it possible to create a sort of template slot?

转载 作者:太空狗 更新时间:2023-10-29 20:08:31 25 4
gpt4 key购买 nike

我是 Qt 新手,不是 C++ 专家,所以请多多包涵。我正在开发一个具有 12 个不同 QPushButton 的应用程序,但它们都执行非常相似的操作:它们从 map 中获取一些值,然后使用它来设置该按钮的样式:

void MainWindow::on_btn01_clicked(){
QString img=images["btn01"];
ui->btn01->setStyleSheet("#btn01{ background-image: url(://" + img + ") }");
}

对于 12 个按钮中的每一个,我都必须创建一个插槽,该插槽仅在所使用的按钮上有所不同。所以创建 12 个几乎相同的函数看起来有点奇怪。

有更好的方法吗?

最佳答案

一般来说,我见过使用过的几种方法:

  1. 首选方法:lambda 表达式。

    如果您使用的是现代 C++(C++11 或更新版本),则可以使用 a lambda function以获得您所描述的确切效果。

    我希望生成的代码看起来像这样:

    foreach( QPushButton * button : buttons ) {
    connect( button, &QPushButton::clicked, [button, &images]() {
    button->setStyleSheet( QString( "{ background-image: url(://%1) }" )
    .arg( images[button->objectName()] ) );
    });
    }

    有关如何使用 Qt 编写 lambda 函数的更多指南,请参阅“Qt Slots and C++11 lambda”。

  2. 更脏的方法:QObject::sender()。

    Qt 允许您使用 QObject::sender()在槽中获取指向调用它的对象的指针。多年来,这一直是一种广泛使用的方法,但也存在局限性,如 Qt 文档中所述:

    Warning: As mentioned above, the return value of this function is not valid when the slot is called via a Qt::DirectConnection from a thread different from this object's thread. Do not use this function in this type of scenario.

    有关详细信息,请参阅“How to get sender widget with a signal/slot mechanism?”。

  3. 过时的代码:QSignalMapper。

    有一个 QSignalMapper类可以让您将信号与一些数据(如字符串)相关联,然后连接到使用此参数的插槽。这曾经作为 Qt 中的便利类存在,但正在逐步淘汰,因为 lambda 方法使其变得毫无意义。

    如果您需要更新使用 QSignalMapper 的代码以将其删除,this tutorial是一个合理的起点。

关于C++ Qt : is it possible to create a sort of template slot?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53509915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com