首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C++的Qt :类"AddDialog“没有成员"carNameEdit”

使用C++的Qt :类"AddDialog“没有成员"carNameEdit”
EN

Stack Overflow用户
提问于 2022-03-17 16:17:58
回答 2查看 46关注 0票数 0

我遵循Qt中的这个教程来创建我的第一个porject。我已经重命名了一些小部件,但是我一直使用自己的名字。

但是,当我现在尝试在AddDialog中访问标签的文本时,AddDialog似乎没有这个标签,甚至名称都是相同的,我在教程中也有。

以下是代码:

carrental.cpp

代码语言:javascript
复制
#include "carrental.h"
#include "stdafx.h"
#include "adddialog.h"
#include "ui_adddialog.h"

CarRental::CarRental(QWidget* parent)
    : QWidget(parent)
{
    ui.setupUi(this);
}

void CarRental::on_addButton_clicked()
{
    AddDialog dialog(this);

    if (dialog.exec()) {
        QString carName = dialog.carNameEdit->text();
        QString carModel = dialog.carModelEdit->text();

        if (!carName.isEmpty() && !carModel.isEmpty()) {
            QListWidgetItem* item = new QListWidgetItem(carName, ui.carList);
            item->setData(Qt::UserRole, carModel);
            ui.carList->setCurrentItem(item);
        }
    }
}

Adddialog.h

代码语言:javascript
复制
#pragma once

#include <QDialog>
#include "ui_adddialog.h"

class AddDialog : public QDialog
{
    Q_OBJECT

public:
    AddDialog(QWidget* parent = Q_NULLPTR);

private:
    Ui::AddDialog ui;
};

adddialog.ui:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>AddDialog</class>
 <widget class="QDialog" name="AddDialog">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>345</width>
    <height>230</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>AddDialog</string>
  </property>
  <widget class="QWidget" name="layoutWidget">
   <property name="geometry">
    <rect>
     <x>60</x>
     <y>50</y>
     <width>221</width>
     <height>131</height>
    </rect>
   </property>
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
     <layout class="QVBoxLayout" name="verticalLayout">
      <item>
       <layout class="QGridLayout" name="inputLayout">
        <item row="0" column="0">
         <widget class="QLabel" name="carNameText">
          <property name="text">
           <string>Car Name:</string>
          </property>
         </widget>
        </item>
        <item row="0" column="1">
         <widget class="QLineEdit" name="nameEdit">
          <property name="text">
           <string>Name</string>
          </property>
         </widget>
        </item>
        <item row="1" column="0">
         <widget class="QLabel" name="carModelText">
          <property name="text">
           <string>Car Model:</string>
          </property>
         </widget>
        </item>
        <item row="1" column="1">
         <widget class="QLineEdit" name="carModelEdit"/>
        </item>
       </layout>
      </item>
      <item>
       <spacer name="verticalSpacer">
        <property name="orientation">
         <enum>Qt::Vertical</enum>
        </property>
        <property name="sizeHint" stdset="0">
         <size>
          <width>20</width>
          <height>40</height>
         </size>
        </property>
       </spacer>
      </item>
     </layout>
    </item>
    <item row="1" column="0">
     <layout class="QHBoxLayout" name="okLayout">
      <item>
       <spacer name="horizontalSpacer">
        <property name="orientation">
         <enum>Qt::Horizontal</enum>
        </property>
        <property name="sizeHint" stdset="0">
         <size>
          <width>40</width>
          <height>20</height>
         </size>
        </property>
       </spacer>
      </item>
      <item>
       <widget class="QPushButton" name="okButton">
        <property name="text">
         <string>OK</string>
        </property>
       </widget>
      </item>
     </layout>
    </item>
   </layout>
  </widget>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections>
  <connection>
   <sender>okButton</sender>
   <signal>clicked()</signal>
   <receiver>AddDialog</receiver>
   <slot>accept()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>251</x>
     <y>167</y>
    </hint>
    <hint type="destinationlabel">
     <x>100</x>
     <y>196</y>
    </hint>
   </hints>
  </connection>
 </connections>
</ui>

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-17 16:40:14

carNameEdit和carModelEdit是私有ui对象的属性,因此您无法访问它们,一个可能的解决方案是使它们公开,但另一个更好的选择是创建公开字符串的公共方法:

代码语言:javascript
复制
public:
    AddDialog(QWidget* parent = Q_NULLPTR);
    QString carName() const;
    QString carModel() const;
private:
    Ui::AddDialog ui;
代码语言:javascript
复制
QString AddDialog::carName() const
{
    return ui.carNameEdit->text();
}

QString AddDialog::carModel() const
{
    return ui.carModelEdit->text();
}

然后改为:

代码语言:javascript
复制
QString carName = dialog.carName();
QString carModel = dialog.carModel();
票数 1
EN

Stack Overflow用户

发布于 2022-03-17 16:49:42

@eyllanesc提供的好答案的一个小的补充;您可以使用QObject::findChild Qt特性:

就你的情况而言,可能是:

代码语言:javascript
复制
QLineEdit *carModelEdit= dialog.findChild<QLineEdit*>("carModelEdit");
qDebug() << carModelEdit->text();

它可以工作,因为在ui.setupUi(this);之后,UI的所有元素都成为小部件的子元素。

对于单元测试非常有用,但是您是否应该在生产代码中使用它是有点疑问的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71515719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档