带参数的QT信号如何工作

问题描述

有人可以告诉我带有参数的信号是如何工作的吗?我的意思是...如果我已声明信号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

是什么意思? 如果您的信号有一个参数,则您的插槽也应至少有一个参数。请参阅下面的表格。

enter image description here

  • 在第一行上,您有一个带有两个参数的信号,因此,您的插槽可以有两个参数(使用所有信号参数),或一个参数(忽略信号的一个参数)或不包含参数(忽略两个信号参数)

  • 在第二行上,您有一个带有一个参数的信号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();
}