想要將兩個引數傳遞給插槽。我有ui->spinBox,它有兩個信號valueChanged(int)和valueChanged(QString)。我正在這樣做:
connect(ui->spinBox,&QSpinBox::valueChanged, [&](){ this->ChangeParamCurve(ui->spinBox_11->value(),0);});
出現錯誤:
錯誤:沒有匹配的成員函式呼叫'connect' qobject.h:463:41:注意:候選函式不可行:'valueChanged'沒有多載匹配'const char *'的第二個引數qobject.h:260:13:注意:候選模板被忽略:無法推斷模板引數'Func1' qobject.h:300:13:注意:候選模板被忽略:無法推斷模板引數'Func1' qobject.h:208:36:注意:候選函式不可行:至少需要 4 個引數,但提供了 3 個 qobject.h:211:36:注意:候選函式不可行:需要至少 4 個引數,但提供了 3 個 qobject.h:228:43:注意:候選函式模板不可行:至少需要 4 個引數,但提供了 3 個 qobject.h:269:13:注意:候選函式模板不可行:至少需要 4 個引數,但提供了 3 個 qobject.h:308:13:注意:候選函式模板不可行:至少需要 4 個引數,但提供了 3 個
我認為 qt 不能接受多載信號或類似的東西。有什么想法嗎?
uj5u.com熱心網友回復:
如@chehrlic 指出的檔案中所示,連接到此信號時需要使用 QOverload。
connect(spinBox, QOverload<int>::of(&QSpinBox::valueChanged),
[=](int i){ ChangeParamCurve(i, 0); });
此外,接受多少引數也沒有關系ChangeParamCurve。lambda 函式是此處連接的插槽。它應該只采用一個引數,因為這就是信號發送的內容。但是在 lambda 中,您可以呼叫具有任意數量引數的函式。
uj5u.com熱心網友回復:
spinbox您可以自己從類中派生一個物件。您可以根據需要向其添加信號和插槽。
我曾經做過這樣的事情,因為沒有“焦點”事件qlineedit。讓我提出我寫的主要思想qlineedit。
如果你想有一個集中的信號,你將不得不派生QLineEdit類。以下是如何實作這一目標的示例。
在myLineEdit.h您擁有的檔案中:
class MyLineEdit : public QLineEdit
{
Q_OBJECT
public:
MyLineEdit(QWidget *parent = 0);
~MyLineEdit();
signals:
void focussed(bool hasFocus);
protected:
virtual void focusInEvent(QFocusEvent *e);
virtual void focusOutEvent(QFocusEvent *e);
};
在myLineEdit.cpp您擁有的檔案中:
MyLineEdit::MyLineEdit(QWidget *parent)
: QLineEdit(parent)
{}
MyLineEdit::~MyLineEdit()
{}
void MyLineEdit::focusInEvent(QFocusEvent *e)
{
QLineEdit::focusInEvent(e);
emit(focussed(true));
}
void MyLineEdit::focusOutEvent(QFocusEvent *e)
{
QLineEdit::focusOutEvent(e);
emit(focussed(false));
}
您現在可以將MyLineEdit::focussed()信號連接到您的focus()方法(插槽)。
同樣,兩個事件可以使用自定義引數觸發您的自定義事件。同樣,如果您愿意,可以spinbox通過右鍵單擊并使用Promote to方法將這些功能添加到 Designer 中的現有 .
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/487707.html
