C++;Qt:可以创建一种模板槽吗? 我是QT新手,不是C++专家,所以请用这个来支持我。 我正在开发一个有12个不同QpushButton的应用程序,但它们都执行非常相似的操作:它们从地图中获取一些值,然后使用它来设置该按钮的样式: void MainWindow::on_btn01_clicked(){ QString img=images["btn01"]; ui->btn01->setStyleSheet("#btn01{ background-image: url(://" + img + ") }"); }
对于12个按钮中的每一个,我必须创建一个插槽,该插槽仅在所使用的按钮上有所不同。因此,创建12个几乎相同的函数看起来有点奇怪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,
有更好的方法吗?一般来说,我见过几种方法:
如果你使用的是现代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函数的更多指导,请参阅“”您可以尝试一种更简单的方法,即分别设置
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+”));