由按钮按按钮创建的QOBject

Mainpulating a QObject created from a button press

本文关键字:按钮 QOBject 创建      更新时间:2023-10-16

我正在制作应用程序,在某些时候,用户将创建某种来自/调查的方式。创建时,用户将通过按下按钮和新对象选择各种问题类型等。

创建一个新部分,例如:

void CreateSurvey::question_section()
{
 QLabel *sectionTitle = new QLabel();
 sectionTitle->setText("New Section");
 layout->addWidget(sectionTitle);
 QLabel *titleLabel = new QLabel("Title");
 QLineEdit *titleEdit = new QLineEdit("New Section");
 QHBoxLayout *hLayout = new QHBoxLayout;
 hLayout->addWidget(titleLabel);
 hLayout->addWidget(titleEdit);
 layout->addLayout(hLayout);
 sectionCount++;
 qDebug() << "sections: " << sectionCount;
}

运行应用程序时,用户将对本节标题进行编辑文本" titledit"。说这被称为3次,因此有3个部分。如何使每个部分的标题输入字符串?或如何为特定部分输入字符串?

谢谢

您可以使用QVector之类的容器来存储QLineEdit对象。使用此容器访问每个QLineEdit对象的文本。

#include <QApplication>
#include <QtWidgets>
class Survey : public QWidget
{
    Q_OBJECT
public:
    Survey(QWidget *parent = Q_NULLPTR) : QWidget(parent)
    {
        resize(600, 400);
        setLayout(new QVBoxLayout);
        layout()->setAlignment(Qt::AlignTop);
        QPushButton *button = new QPushButton("Add line edit");
        connect(button, &QPushButton::clicked, this, &Survey::addLineEdit);
        layout()->addWidget(button);    
        QPushButton *print_button = new QPushButton("Print all text");    
        connect(print_button, &QPushButton::clicked, this, [=]
        {
            for(int i = 0; i < line_edit_vector.size(); i++)
                qDebug() << getText(i);
        });    
        layout()->addWidget(print_button);
    }
    QString getText(int index) const
    {
        if(line_edit_vector.size() > index)
            return line_edit_vector[index]->text();
        return QString();
    }
private slots:
    void addLineEdit()
    {
        QLineEdit *edit = new QLineEdit("Line edit");
        layout()->addWidget(edit);
        line_edit_vector.append(edit);
    }
private:
    QVector<QLineEdit*> line_edit_vector;
};
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Survey survey;
    survey.show();
    return a.exec();
}
#include "main.moc"

在您的CreateSurvey标题中添加

public slot:
    void title_changed();

在您的question_section方法中,添加一个连接:

connect(titleEdit,SIGNAL(editingFinished()),this,SLOT(title_changed()));

并添加title_changed插槽:

void CreateSurvey::title_changed()
{
    QLineEdit *titleEdit=qobject_cast<QLineEdit*>(sender());
    if (titleEdit) {
      qDebug() << titleEdit->text();
    }
}

以这种方式进行编辑时,将触发插槽title_changed

如果您想知道所有标题曾经仅一个已编辑,请使用此插槽:

void CreateSurvey::title_changed()
{
     for (int i = 0; i < layout->count(); ++i) {
         QLineEdit *titleEdit=qobject_cast<QLineEdit*>(layout->itemAt(i));
         if (titleEdit) {
             qDebug() << titleEdit->text();
         }
     }
}