1

我正在创建一个 GUI,用于存储和显示各种数据类型的对象,例如 int、double、string 和我创建的其他三个类,即 Rational、Date 和 Complex。这些对象存储在相同类型的链表中。对于 int、double 和 string,我不得不将用户输入QPlainTextEdit的值存储到列表中并将它们显示到QTextBrowser中,但是,我不确定如何显示我创建的类中的对象进入 QTextBrowser。有没有可以做到这一点的功能?

我目前正在使用我的 Rational 类,它以“Rational(3,4);”的形式接收对象 并将它们显示为诸如"3/4"之类的分数。我已经设法从“3/4”形式的用户输入创建对象并将它们推送到链接列表中,但我无法将它们显示到我的 QTextBrowser

//sample code
else if(ui->Rational_button->isChecked())
{
    ui->main_display->setText("");

    //Iterator that goes through the linked list to get the objects
    LinkedList<Rational>::Iterator it = rationalvec.begin();

    while(it != nullptr)
    {
       ui->main_display->append(QString::fromStdString(*it)); 
                                      /* Trying to display all Rational 
                                      objects in the QTextBrowser */
       ++it;                    
    }
}

//There should be an output like the following inside the QTextBrowser

4/5
2/3
7/9
9/11

//These are all Rational type objects

我遇到了一个“语义问题” ,没有从 'Rational' 到 QString/const std::string 的可行转换。我似乎找不到将这些对象转换或显示到 QTextBrowser 中的方法。

编辑:这是 Rational 类

class Rational
{
private:
    int numer;  //IN/OUT - the numerator int
    int denom;  //IN/OUT - the denominator int
public:
    /******************************
    ** CONSTRUCTOR & DESTRUCTOR **
    ******************************/
    Rational()         //Constructor
    {
       numer = 0;
       denom = 1;
    }
    Rational(int number)               //Constructor
    {
       numer = number;
       denom = 1;
    }
    Rational(int number1, int number2) //Constructor
    {
      numer = number1;
      denom = number2;
    }  

    /***************
    ** ACCESSORS **
    ***************/
    const Rational add(const Rational &) const;
    const Rational subtract(const Rational &) const;
    const Rational multiply(const Rational &) const;
    const Rational divide(const Rational &) const;

    void display() const
    {
       cout << numer << "/" << denom;
    }

    friend ostream& operator<<(ostream &, const Rational &)    //FOR WIDGET
    {
       out << object.numer;
       out << '/';
       out << object.denom;

       return out;
   }

    bool operator <(const Rational& )                          //FOR WIDGET
    {
       if((numer/denom) < (other.numer/other.denom))
           return true;
       else
           return false;
    }
    bool operator >(const Rational& )                          //FOR WIDGET
    {
       if((numer/denom) > (other.numer/other.denom))
           return true;
       else
           return false;
     }        

};

仅显示我正在使用的函数的函数定义,其他未显示定义的函数是我在此程序中不会使用的函数。

4

2 回答 2

1

你正在寻找这样的东西吗?

像这样编辑您的代码:

  • 向您的类添加一个toString功能:
class Rational
{

...

public:
    QString toString() [
        return QString::number(numer) + "/" + QString::number(denom);
    }

...

}
  • 显示在QTextBrowser
else if(ui->Rational_button->isChecked())
{
    ui->main_display->setText("");

    for( Rational r : rationalvec )
    {

       ui->main_display->append( r.toString() );    // Here use toString() to append
                                                    // it->toString() if iterator
    }
}

希望它可以帮助你。

于 2019-06-01T21:51:34.420 回答
0

我不确定如何显示我在 QTextBrowser 中创建的类中的对象。有没有可以做到这一点的功能?

只要你写一个。这是你的课,所以提供这样的功能是你的工作。

你如何处理这取决于你的类是如何被使用的。如果将您的类视为一个字符串是合理的(对于有理数来说似乎不太可能),您可以提供一个隐式的用户定义转换string. 在其他情况下,您不应提供隐式转换,因为隐式转换通常会妨碍编译器识别错误的能力。显式转换是另一种选择,但人们通常会使用转换函数。(标准库中的示例包括stringstream::strbitset::to_string。)

您已经编写了大部分转换函数。您所需要做的就是将您的对象流式传输到std::stringstream然后调用该流的str()方法。尽可能合理地重用您的代码。

于 2019-06-02T01:09:56.603 回答