问题描述
有人可以告诉我带有参数的信号是如何工作的吗?我的意思是...如果我已声明信号f.e。:
--output
我应该如何指定要随该信号发送的整数?另外,我可以用多个参数声明信号吗?喜欢:
arguments
再次...我想用sign2发送我拥有的四个变量中的两个。那有可能吗,应该怎么做?在下面指定我的问题是一个更详细的示例:
--input artifact1 --input artifact2 --output artifact3
,并且带有带按钮的board.ui文件。单击按钮后,我想发送到插槽,例如x1和x3。示例:
void sign1(int)
我希望这很清楚。非常感谢您的帮助。
解决方法
QObject::connect()
的工作方式如下(通常情况下,不使用lambda):
connect(obj1,obj1_signal,obj2,ob2_slot)
由于类clicked(int,int)
中没有信号QPushButton
(我假设您正在使用),因此无法将其用于连接。
如果要在按钮中添加信号clicked(int,int)
,则可以继承QPushButton
的子类,添加信号,然后使用emit
将信号发送到处理单击事件的位置。
但是,这不是一个好的设计,因为您将不得不在与该类无关的按钮类中存储一个Board对象(或至少对其的引用)。
相反,您可以将插槽Board::buttonClicked()
连接到QPushButton::clicked(bool)
。然后在该插槽中,您可以执行emit Board::clicked(int,int)
。
信号/插槽连接规则可以表述为:
You can ignore signal arguments,and you cannot create slot arguments from nothing
是什么意思? 如果您的信号有一个参数,则您的插槽也应至少有一个参数。请参阅下面的表格。
-
在第一行上,您有一个带有两个参数的信号,因此,您的插槽可以有两个参数(使用所有信号参数),或一个参数(忽略信号的一个参数)或不包含参数(忽略两个信号参数)
-
在第二行上,您有一个带有一个参数的信号
valueChanged(int)
。您的广告位可能只有一个参数,也可能没有参数(忽略信号参数),但可能没有 或更多you cannot create values
作为参数。 -
在第三行,信号
textChanged(QString)
无法与setValue(int)
连接,因为我们无法从QString创建一个int
值。 -
第四行遵循这些规则。如果信号没有参数,则连接的信号无法创建新参数,因此
update()
是正确的,setValue(int)
不是。 -
要注意的另一点是信号/时隙的过载。在这种情况下,许多具有相同名称但编号不同或参数类型不同的信号/插槽。 您可能拥有类
所述QLCDNumber
,其中插槽display
具有许多重载。在此cas中,您必须明确定义要使用的信号槽对,如here
您可以尝试以下示例:
示例:
#include <QtWidgets>
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
QWidget *window = new QWidget();
window->setAttribute(Qt::WA_DeleteOnClose);
QVBoxLayout *topLayout = new QVBoxLayout(window);
//Set up of GUI
QSlider *slider = new QSlider(Qt::Horizontal);
slider->setRange(0,100);
QSpinBox *spin = new QSpinBox;
spin->setReadOnly( true );
QHBoxLayout *horizontalLayout = new QHBoxLayout;
horizontalLayout->addWidget(slider);
horizontalLayout->addWidget(spin);
topLayout->addLayout(horizontalLayout);
// using pointer to member function
QObject::connect(slider,&QSlider::valueChanged,spin,&QSpinBox::setValue);
// set the slider position and hence the QSpinBox value too
slider->setValue(40);
// Uncommenting the following connect will result in a compile time error.
// The signal passes no arguments whereas the slot is expecting a single
// argument.
// By using function pointers we get compile time parameter list checking.
// Using the old-style SIGNAL/SLOT macros this would have been detected
// as a run time warning only.
//QObject::connect(slider,&QSlider::sliderPressed,// spin,&QSpinBox::setValue);
QTextEdit *textEdit = new QTextEdit();
textEdit->setAttribute(Qt::WA_DeleteOnClose);
// Uncommenting the following connect will result in a compile time error.
// The signal is passing an incompatible parameter to the slot.
// By using function pointers we get compile time parameter type conversion.
// Using the old-style SIGNAL/SLOT macros this would have been detected
// as a run time warning only.
//QObject::connect(slider,&QSlider::sliderMoved,// textEdit,&QTextEdit::setFontFamily);
window->show();
return app.exec();
}