【问题标题】:Mainpulating a QObject created from a button press操作从按钮按下创建的对象
【发布时间】:2016-12-12 09:55:01
【问题描述】:

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

创建一个新部分,例如:

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;
}

当应用程序运行时,用户将编辑文本“TitleEdit”作为该部分的标题。 假设这已经被调用了 3 次,所以有 3 个部分。如何获取为每个部分的标题输入的字符串?或者如何获取为特定部分输入的字符串?

谢谢

【问题讨论】:

  • 您需要存储您感兴趣的对象。否则您将不会(简单地)访问它们。
  • 我该怎么做?在数组中?
  • 布局包含您要添加的所有对象。您可以循环并提取您需要的数据。
  • @Phauk:你想要的任何容器。在 Qt 库和 std 中有很多。
  • @bibi,你是什么意思'循环并提取你需要的数据'?我不知道该怎么做

标签: c++ string qt qobject


【解决方案1】:

您可以使用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"

【讨论】:

  • 谢谢,我会试试看的。下一步是将其存储为 JSON,以便可以再次创建相同的调查。这可能吗?
  • @Phauk 当然。见this example
  • 这真的很有帮助。我打算将 QLayouts 存储在我的向量中。我正在运行一个快速示例来尝试存储一些 QLayout,然后再次将它们打印出来。 ` question_vector.append(dLayout); question_vector.append(sLayout); question_vector.append(eLayout); connect(ui->submitButton, &QPushButton::clicked, this, [=] {surveyLayout->addItem(question_vector.at(0)); });` 但是当我按下 submitButton 时,会添加一个空格,而不是布局(和小部件)我正在尝试添加。我做错了什么?
  • 无法弄清楚如何格式化代码的注释:(
  • @Phauk 我不知道你的应用程序的设计,但你应该考虑的一点:点击按钮时不要添加布局,为什么不只显示一个隐藏的小部件?在该小部件上设置此布局。
【解决方案2】:

在您的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();
         }
     }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多