Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;Qt:可以创建一种模板槽吗? 我是QT新手,不是C++专家,所以请用这个来支持我。 我正在开发一个有12个不同QpushButton的应用程序,但它们都执行非常相似的操作:它们从地图中获取一些值,然后使用它来设置该按钮的样式: void MainWindow::on_btn01_clicked(){ QString img=images["btn01"]; ui->btn01->setStyleSheet("#btn01{ background-image: url(://" + img + ") }"); }_C++_Qt - Fatal编程技术网

C++;Qt:可以创建一种模板槽吗? 我是QT新手,不是C++专家,所以请用这个来支持我。 我正在开发一个有12个不同QpushButton的应用程序,但它们都执行非常相似的操作:它们从地图中获取一些值,然后使用它来设置该按钮的样式: void MainWindow::on_btn01_clicked(){ QString img=images["btn01"]; ui->btn01->setStyleSheet("#btn01{ background-image: url(://" + img + ") }"); }

C++;Qt:可以创建一种模板槽吗? 我是QT新手,不是C++专家,所以请用这个来支持我。 我正在开发一个有12个不同QpushButton的应用程序,但它们都执行非常相似的操作:它们从地图中获取一些值,然后使用它来设置该按钮的样式: void MainWindow::on_btn01_clicked(){ QString img=images["btn01"]; ui->btn01->setStyleSheet("#btn01{ background-image: url(://" + img + ") }"); },c++,qt,C++,Qt,对于12个按钮中的每一个,我必须创建一个插槽,该插槽仅在所使用的按钮上有所不同。因此,创建12个几乎相同的函数看起来有点奇怪 有更好的方法吗?一般来说,我见过几种方法: 首选方法:lambda表达式。 如果你使用的是现代C++(C++ 11或更新版),你可以使用它来获得你所描述的精确效果。 我希望生成的代码如下所示: foreach( QPushButton * button : buttons ) { connect( button, &QPushButton::clicked,

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


有更好的方法吗?

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

  • 首选方法:lambda表达式。

    如果你使用的是现代C++(C++ 11或更新版),你可以使用它来获得你所描述的精确效果。 我希望生成的代码如下所示:

    foreach( QPushButton * button : buttons ) {
      connect( button, &QPushButton::clicked, [button, &images]() {
        button->setStyleSheet( QString( "{ background-image: url(://%1) }" )
          .arg( images[button->objectName()] ) );
      });
    }
    
    有关如何使用Qt编写lambda函数的更多指导,请参阅“”

  • 更脏的方式:QObject::sender()

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

    警告:如上所述,当从与此对象线程不同的线程通过Qt::DirectConnection调用插槽时,此函数的返回值无效。不要在这种情况下使用此功能

    有关详细信息,请参阅“”

  • 过时代码:QSignalMapper

    有一个类可以让你将一个信号与一个数据位相关联,比如一个字符串,然后连接到一个使用这个参数的插槽。这曾经是Qt中的一个方便类,但现在正在逐步淘汰,因为lambda方法使它变得毫无意义

    如果您需要更新使用QSignalMapper删除它的代码,这是一个合理的起点


  • 您可以尝试一种更简单的方法,即分别设置
    QPushButton
    的对象名,然后检查插槽中的对象名并使用该字符串。这为您节省了大量代码

    例如:
    QPushButton 1对象名称设置为
    按钮->设置对象名称(“btn01”)
    和您可以分别设置按钮的其他名称,并在插槽中执行类似操作

    void MainWindow::on_button_clicked(){
         QPushButton* btn=qobject_cast<QPushButton*>(sender()); 
         QString name=btn->objectName(); 
         QString img=images[name]; btn->setStyleSheet("#" + name + "{ background-image: url(://" + img + ");
    }
    
    void主窗口::点击按钮(){
    QPushButton*btn=qobject_cast(sender());
    QString name=btn->objectName();
    QString img=images[name];btn->setStyleSheet(“#“+name+”{背景图像:url(:/“+img+”);
    }
    

    然后将所有
    QPushButtons
    连接到此插槽

    如果您绝对不能使用C++11,则会为此创建弃用和过时的[QSignalMapper][1]。但是,不鼓励在新代码中使用它,我想您很难找到支持Qt5而不是C++11的平台。[1]:我确实在使用C++11,因此感谢您的建议:)我能够使用类似的方法(更改了一些内容,因为我不断收到关于QPushButton尝试转换为QString的错误)。首先将我的所有按钮连接到构造函数中的插槽:
    connect(ui->btn01,SIGNAL(clicked()),this,slot(on_button_clicked())
    并对每个按钮执行一次(不确定是否有办法避免调用它12次)。然后我将插槽实现为:
    QPushButton*btn=qobject\u cast(sender();QString name=btn->objectName();QString img=images[name];btn->setStyleSheet(#“+name+”{背景图像:url(:/“+img+”));