Есть ли функция, которая может отображать объект из класса, который я создал, в QTextBrowser?

Я создаю графический интерфейс, который хранит и отображает объекты различных типов данных, таких как 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.

EDIT: вот класс 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;
     }        

};

Показаны только определения функций, которые я использую, другие функции, определения которых не показаны, я не буду использовать в этой программе.


person Angel Torres    schedule 01.06.2019    source источник
comment
что такое Рационал? показать Рациональный класс.   -  person eyllanesc    schedule 01.06.2019
comment
@eyllanesc Готово. Я отредактировал вопрос, чтобы показать свой класс Rational.   -  person Angel Torres    schedule 02.06.2019


Ответы (2)


Что-то вроде этого, что вы ищете?

Отредактируйте свой код следующим образом:

  • Добавьте в свои классы функцию 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
    }
}

Надеюсь, это поможет вам.

person Tom Kim    schedule 01.06.2019
comment
Это сработало отлично, спасибо за помощь. Реализовал эту функцию для всех моих других классов, и теперь они работают нормально. На самом деле мне очень помогло подумать о создании других вспомогательных функций, которые могут помочь мне позже. - person Angel Torres; 02.06.2019

я не уверен, как отображать объекты из классов, которые я создал, в QTextBrowser. Есть ли функция, которая может это сделать?

Только если ты напишешь. Это ваш класс, поэтому ваша задача — предоставить такую ​​функцию.

То, как вы это сделаете, зависит от того, как ваш класс предназначен для использования. Если разумно думать о вашем классе как о строке (кажется маловероятным для рационального числа), вы можете указать неявный определяемое пользователем преобразование в string. Вы не должны обеспечивать неявное преобразование в других случаях, так как неявные преобразования часто мешают компилятору идентифицировать ошибки. Явное преобразование — еще один вариант, но часто люди используют функцию преобразования. (Примеры из стандартной библиотеки включают stringstream::str и bitset::to_string.)

У вас уже написана большая часть функции преобразования. Все, что вам нужно, это передать ваш объект в поток std::stringstream, а затем вызвать метод этого потока str(). Повторно используйте свой код настолько, насколько это разумно.

person JaMiT    schedule 02.06.2019
comment
Я думал нестандартно, и мне никогда не приходило в голову, что я мог бы вернуться и создать еще одну функцию в своих классах, которая будет иметь дело с классом QString, спасибо за помощь и внимание! - person Angel Torres; 02.06.2019