问题描述
我对QT还是很陌生,我想做以下事情:
具有一个布局,该布局最初由1个QLineEdit(text
)用于输入和1个用于确认它的按钮(button
)组成。
然后我想在单击按钮时发送信号SetN(N)
,并且该信号应激活ArrayEdit(N)
插槽,这将更改Laitot以具有N个输入(QLineEdit),以及1个按钮来发送信号在它们中(作为一个数组)进行进一步处理。
我设法完成了第一部分,但是...没有用,我也不知道如何处理此no matching member function
错误
这是我班上的代码:
#include "textlayout.h"
TextLayout::TextLayout()
{
setWindowTitle("Choosing N value");
resize(200,200);
auto layout = new QGridLayout(this);
auto text = new QLineEdit;
text->resize(10,30);
auto button = new QPushButton();
button->setText("set");
layout->addWidget(text,0);
layout->addWidget(button,1);
QObject::connect(&button,SIGNAL(SetN())„ this,SLOT(ArrayEdit())); //no matching member function for call to 'connect'
int N = text->text().toInt();
if(N > 0)
{
emit SetN(N);
}
}
及其头文件:
#ifndef TEXTLAYOUT_H
#define TEXTLAYOUT_H
#include <QWidget>
#include <QLineEdit>
#include <QLabel>
#include <QPushButton>
#include <QGridLayout>
#include <QObject>
class TextLayout : public QWidget
{
Q_OBJECT
public:
TextLayout();
public slots:
void ArrayEdit(int N);I
signals:
void SetN(int N);
};
#endif // TEXTLAYOUT_H
我知道实际上现在我没有在点击时激活此信号,但是...以前我没有意识到这一点,而且我不知道如何通过onclick信号发送参数... 我如何解决该问题以及如何修复此类?
解决方法
您距离这样做不远..让我帮您一点:)
TextLayout::TextLayout()
{
setWindowTitle("Choosing N value");
resize(200,200);
/*auto*/ layout = new QGridLayout(this);
//declare layout in header,cos you will need it later in the slot
auto text = new QLineEdit;
text->resize(10,30);
auto button = new QPushButton();
button->setText("set");
layout->addWidget(text,0);
layout->addWidget(button,1);
//QObject::connect(&button,SIGNAL(SetN())„ this,SLOT(ArrayEdit())); //no matching member function for call to 'connect'
//you dont need the QObject cos Textlayout is a QObject so just call connect:
connect(this,&TextLayout::SetN,this,&TextLayout::ArrayEdit);
//SetN is not a signal of QButton so you cant connect that like that... instead
connect(&button,&QPushButton::clicked,[this]()
{
int N = text->text().toInt();
if(N > 0)
{
emit SetN(N);
}
});
}
,
如果处理数字值,请使用QSpinBox而不是QLineEdit。然后,您还可以设置限制,并且用户不能输入无效数据。 将QLineEdit用于文本。
Widget.hpp
#pragma once
#include <QWidget>
class QGridLayout;
class QLineEdit;
class QPushButton;
class QSpinBox;
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void adjustLayout(int n);
private:
QGridLayout* _layout {};
QPushButton* _button {};
QSpinBox* _spinBox {};
QVector<QLineEdit*> _lineEditVector;
};
Widget.cpp
#include "Widget.hpp"
#include <QGridLayout>
#include <QLineEdit>
#include <QPushButton>
#include <QSpinBox>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
_layout = new QGridLayout(this);
_spinBox = new QSpinBox;
_button = new QPushButton("set");
_layout->addWidget(_spinBox,0);
_layout->addWidget(_button,1);
connect(_button,[this](bool) {
emit adjustLayout(_spinBox->value());
});
}
Widget::~Widget() = default;
void Widget::adjustLayout(int n)
{
for (int i=0; i<n; ++i)
{
QLineEdit* lineEdit = new QLineEdit(QString::number(i+1));
// for later access,keep a reference in the vector:
_lineEditVector.push_back(lineEdit);
_layout->addWidget(lineEdit,i + 1,0);
}
}