Member 13740197 Ответов: 1

Как получить доступ к пользовательскому интерфейсу виджета из другого файла .cpp в QT C++


Привет,

Я должен вызвать функцию виджета(Регистрация) из другого файла .cpp под названием ApplicationWindow.cpp.

Widget.cpp
Void Widget::registration()
{
    qDebug()<<"In registration function";
    QString regid = ui->lineedit_regid->text;
    qDebug()<<"regid="<<regid;
    //  after calling some API
}



ApplicationWindow.cpp


Void ApplicationWindow::closeApp()
{
    Widget *obj = new Widget();
    obj->registration(); //from here I have to call registration function
}



В ApplicationWindow.h я включил виджет.h.


Здесь я могу вызвать функцию регистрации из ApplicationWindow, но неспособность получить доступ к пользовательскому интерфейсу означает неспособность прочитать текст lineedit. Когда я печатаю regid, он печатает пустой(ничего).

Итак, как читать эту строку редактирования текста, не могли бы вы, пожалуйста, предоставить решение для этого.

Что я уже пробовал:

Widget.cpp
Void Widget::registration()
{
    qDebug()<<"In registration function";
    QString regid = ui->lineedit_regid->text;
    qDebug()<<"regid="<<regid;
    ///  after calling some API  /////
}



ApplicationWindow.cpp


void ApplicationWindow::closeApp()
{
    Widget *obj = new Widget(); 
    obj->registration();  // from here I have to call registration function

}

1 Ответов

Рейтинг:
4

Rick York

Вы должны предоставить открытый интерфейс объекту, который вас интересует. Обычно это делается с помощью статических методов одного объекта. Например, обычно существует только одно главное окно приложения, и оно может иметь статический метод Get (), который возвращает указатель на себя. Затем этот указатель можно использовать для доступа к другим элементам объекта. Вы можете сделать нечто подобное - дать объекту, содержащему элемент управления, статический член Get (), который возвращает указатель на себя, а затем вы можете получить доступ к элементу управления, если он является открытым членом или существует метод, который возвращает указатель на него.

-редактировать-

Вот вам пример:

class MyWindow
{
public:
    static MyWindow * Get() { return m_pThis; }

protected:
    static MyWindow * m_pThis;
};
Теперь вы можете получить доступ к указателю на MyWindow из любого места, которое включает в себя заголовочный файл MyWindow. Если ваш элемент управления является общедоступным, то он доступен напрямую. Если нет, то вам нужно будет предоставить метод доступа, например GetTheControl() или что-то еще.


Member 13740197

Не могли бы вы объяснить это на примере?

Rick York

к решению был добавлен пример.

Member 13740197

Мой код
общественный:
статический виджет * Get(){return w_pThis;}

защищенный:
статический виджет * w_pThis;

После использования этого я получаю ниже ошибку

ошибка: неопределенная ссылка на `Widget::m_pThis'

Не могли бы вы сказать мне, как это решить?

Rick York

Я надеюсь, что код, который вы опубликовали, находится в классе Window. В противном случае от него мало пользы.

One of the rules of using static variables is there has to be what amounts to an external declaration or, in essence, an instantiation. In the implementation file you need to have this : Widget * Widget::m_pThis = nullptr; and then remember to set the value of m_pThis in the constructor of the class. Note that since this is a static member there can be only one instance of it which means only one instance of the Widget object also. That's why my sample code had the static pointer in the window. The window typically contains several widgets and all of them would be accessible through the static pointer to the window object : Window::Get()->m_Widget_1.do_something();