Felusogar
Felusogar

Reputation: 1

C++ QT error using ui in another class

I have a problem in Qt. I want to use "ui" in another class function.

With this code:

void test::TextAp()
{
MainWindow::ui->QTextBrowser->append("Test");
}

I get these errors:

  1. error C2227: left of '->qTextBrowser' must point to class/struct/union
  2. error C2227: left of '->append' must point to class/struct/union

And with this code:

void test::TextAp()
{ 
Ui::MainWindow::QTextBrowser->append("Test");
}

I get this error: error C2227: left of '->append' must point to class/struct/union

MainWindow.h:

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    Ui::MainWindow *ui;

private:

};

What can I do?

ps:Excuse my bad English, i'm French

Upvotes: 0

Views: 412

Answers (2)

Michael K
Michael K

Reputation: 39

  1. If "test" is class or struct it has to know about MainWindow object or in particular about it's child object TextBrowser.

  2. Ui creates in the MainWindow constructor so, before using it you have to create it.

And in addition it's a bad practice to do what you want to do, the better solution is to connect signals from your test class (that have to be inherit from QObject) to slot of MainWindow

So bad practice looks:

    //main.cpp
#include "test.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //instance of MainWindow
    MainWindow w; // here constructor of MainWindow creates ui and all the childs
    w.show();
    //instance of test struct
    test t;
    //behind the design mode is creation of code with objects that you can create "manually" typing them
    //to see the ui additional files just press Ctrl and mouse click (for example) on function ui->setupUi(this) in MainWindow constructor
    //it's automatically generated code for ui created according to what you've created in design mode
    //so here textBrowser pointer of object t is points to textBroswer of ui of object w
    t.textBrowserFromTestStruct = w.findChild<QTextBrowser*>("textBrowser");
    //get error if object f ui has no QTextBrowser named textBrowser
    Q_ASSERT(t.textBrowserFromTestStruct);
    //invoke t object function to append text to f textBrowser 10 times
    for(int i = 0; i < 10; ++i)
        t.TextAp("Hello World ");

    return a.exec();
}

 

//test.h
#ifndef TEST_H
#define TEST_H

#include "mainwindow.h"
#include <QTextBrowser>

struct test
{
    QTextBrowser *textBrowserFromTestStruct;
public:
    void TextAp(QString text){textBrowserFromTestStruct->append(text);}
};

#endif // TEST_H

 //mainwindow.h
 #ifndef MAINWINDOW_H
 #define MAINWINDOW_H

 #include <QMainWindow>

 namespace Ui {
 class MainWindow;
 }

 class MainWindow : public QMainWindow
 {
     Q_OBJECT

 public:
     explicit MainWindow(QWidget *parent = 0);
     ~MainWindow();
     Ui::MainWindow *getUI(){return ui;}
 private:
     Ui::MainWindow *ui;
 };

 #endif // MAINWINDOW_H

 

//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{

}

Read about signals and slots to get own solution of what you want using signals and slots. And of course read more about theory of C++ to understand what is private members of classes and structures, what is namespaces and scoping

Upvotes: 0

Aman
Aman

Reputation: 706

If you are referring to default project created by Qt, ui can't be used as it is private. Make a MainWindow object and use it (like it is used in main()).

Now, if you have a QTextBrowser object created in MainWindow, call using that object and not class signature as:

ui->objTextBrowser->append("Test")

Upvotes: 1

Related Questions