Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
98 / 10 / 0
Регистрация: 21.02.2011
Сообщений: 430
1

Доступ к GUI из другого класса. Работает странно

22.04.2017, 01:41. Показов 2178. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую.

Есть графический интерфейс, с формой page.ui. На ней есть например виджет Label.
в page.h добавил
C++ (Qt)
1
2
public slots:
  void autorized (QString Parameter);
в page.cpp, соответственно функция
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
void page::autorized (QString Parameter)
{
if (Parameter == "root")
{
ui->Label->setText("Autorized"); //эта строка не выполняется никогда. Ничего в этот Label не пишется
qWarning () << "Autorized root user"; //Вот это работает отлично, в консоли появляется запись что все ок.
SecondScr->show(); //Открываю другое окно. Все работает отлично (тут не указаноб но сигнал привязан все ок)
this->close(); //а эту форму закрыть (не работает)
}
}
Итог: функцию вызвал из иного класса, вопросов нет. Параметр передан, и условие выполняется. НО! все что связано с виджетами, формой просто игнорируется. Что не так?

Не по теме:

И вообще-то мне не сильно нравится такой способ взаимодействия с формой из другого класса, так как тут хорошо, параметр всего один, а дальше мне надо будет целую вкладку заполнить, параметров дофига. То есть или функция мудреная или JSON объект передавать.

0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2017, 01:41
Ответы с готовыми решениями:

Доступ к GUI из метода другого класса запущенного в фоновом потоке
С доступом к win форме из фонового потока все понятно. Разобрался и с доступом к форме из другого...

Не работает доступ к контролу из другого класса
Итак, имею в Form1 функцию, которая добавляет в конец текстбокса заданный текст. public void...

Странно работает Win32::GUI::MessageBox
Добрый день Народ есть в модуле на перле такая строка my $otvet =...

Доступ к SWT GUI из другого потока
Программа должна раз в секунду читать буфер обмена и выводить данные в текстовое поле...

5
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
22.04.2017, 08:34 2
ui->Label - вместо Label надо было писать имя элемента(Label - это класс).
this->close() - без контекста трудно понять, что вы тут делаете, но возможно надо было "скрывать"(hide), а не "закрывать"(close)?
0
98 / 10 / 0
Регистрация: 21.02.2011
Сообщений: 430
24.04.2017, 06:08  [ТС] 3
Цитата Сообщение от Wyn Посмотреть сообщение
ui->Label - вместо Label надо было писать имя элемента(Label - это класс).
Понимаю. я использовал имя StatusLabel. все равно никаких изменений. текст не меняется. те же самые команды, внутри слота (функции) нажатия кнопки выполняются на ура. временно забудем про this->close(), оставим только изменение текста в виджете. что не так то?
Цитата Сообщение от newline Посмотреть сообщение
Итог: функцию вызвал из иного класса, вопросов нет. Параметр передан, и условие выполняется. НО! все что связано с виджетами, формой просто игнорируется. Что не так?
Может дело в том, что пытаюсь менять что то в экранной фформе из другого класса. иного объяснения столь выборочной работе не вижу.
0
716 / 676 / 110
Регистрация: 29.05.2015
Сообщений: 4,079
24.04.2017, 07:52 4
Может в другом классе нужно генерировать сигнал (emit) и связать его со слотом? Связь между формами с помощью "сигнал-слот" работает. И эта ваша функция "void page::autorized (QString Parameter)" должна быть объявлена как слот.
0
98 / 10 / 0
Регистрация: 21.02.2011
Сообщений: 430
27.04.2017, 04:47  [ТС] 5
Приветствую.

Не пойму. Куда надо connect прописать чтобы соединить сигнал (Где его объявить?) со слотом. Вот подробности и приложении:
main.cpp при запуске начинаю слушать определенный порт
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
main.cpp
 
#include "loginpage.h" //Это для экранной формы (ui)
#include "sqlite.h"
#include <catudp.h>
#include "adminscreen.h"
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    CatUdp *UdpSample = new CatUdp(); //Вот тут все просто. К функции в другом классе доступ получаю создав указатель на класс
 
    int PortOpen = 20056; //вот вместо этой ереси хотелось бы написать ui->PortEdit->text().toInt();
//Как из функции Main получить доступ к форме?
 
    UdpSample->PortBinding(PortOpen); //Вызов функции другого класса. Работает на ура
    LoginPage w;
    w.show();
    return a.exec();
}
LoginPage.cpp

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
LoginPage::LoginPage(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::LoginPage)
{
    ui->setupUi(this);
    ui->StatusLabel->setText("Waiting");
    
}
 
void LoginPage::Autorized(QString Parameter)
{
   if (Parameter == "root")
   {
       ui->StatusLabel->setText("Autorized");  //при вызове этой функции из класса CatUdp эта строка НЕ выполняется
       qWarning () << "Autorized root user";  // Эта выполняется
       AdmScr->show();                             //Эта выполняется
       this->close();  //Эта не выполняется
//Итог: Все что связано с формой проигнорировано. 
   }
   else
   {
       ui->StatusLabel->setText("Wrong login or password");
       qWarning () << "Wrong user name or password";
   }
}
 
LoginPage::~LoginPage()
{
    delete ui;
}
СatUdp.cpp

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void CatUdp::DataReceived(QString ReceivedData, QString SourceIPAddr)
{
    QJsonObject ReceivedJson = ObjectFromStr(ReceivedData);
    LoginPage *LP = new LoginPage;  //Создал указатель на класс в котором нужная мне функция
    qWarning () << "Json was received from";
    qWarning () << SourceIPAddr;
    qWarning () << "Message";
    qWarning () << ReceivedJson;
 
    //parcing JSON. What was received?
 
    QJsonObject ResponseAuth;
    QString Key = ReceivedJson.begin().key();
 
    if (Key == "ResponseAuth")
    {
        QString FirstKey = ReceivedJson["ResponseAuth"].toString();
        if (FirstKey == "RootApproved")
        {
            qWarning () << "Autorized root user";
            LP->Autorized("root");  //Успешно вызвал и передал параметр. Что блин не так? Сдесь emit signal? Как его сделать?
        }
        else
        {
            qWarning () << "Wrong user name or password";
            LP->Autorized("WrongPassword");
        }
    }
 
}
Добавлено через 2 минуты
.h...

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#ifndef LOGINPAGE_H
#define LOGINPAGE_H
 
#include <QMainWindow>
#include "adminscreen.h"
 
namespace Ui {
class LoginPage;
}
 
class LoginPage : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit LoginPage(QWidget *parent = 0);
    ~LoginPage();
 
private slots:
    void on_LoginButton_clicked();
 
private:
    Ui::LoginPage *ui;
    AdminScreen *AdmScr;
signals:
 
public slots:
    void Autorized(QString Parameter);
};
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#ifndef CATUDP_H
#define CATUDP_H
 
#include <QObject>
#include <QUdpSocket>
#include <iostream>
#include <QVector>
#include <QByteArray>
#include <QCryptographicHash>
#include <QtSerialPort/QSerialPort>
#include <string.h>
#include <QCryptographicHash>
#include <QIODevice>
#include <QDataStream>
#include <QJsonObject>
#include <QJsonDocument>
#include <loginpage.h>
 
 
class CatUdp : public QObject
{
    Q_OBJECT
public:
    explicit CatUdp(QObject *parent = 0);
    QUdpSocket *p_udpSocket;
 
private:
    int PortB;
    int&PPortB = PortB;
 
signals:
 
public slots:
    void ReadMessage();
    void SendMessage(QString message, int PortNum, QString IPAddr, qint64 DatagramSize);
    void PortBinding(int port);
    void DataReceived(QString ReceivedData, QString SourceIPAddr);
    QJsonObject ObjectFromStr(const QString& in);
    //void SendFile();
    //void ReceiveFile();
};
 
#endif // CATUDP_H
Добавлено через 3 часа 54 минуты
Цитата Сообщение от newline Посмотреть сообщение
int PortOpen = 20056; //вот вместо этой ереси хотелось бы написать ui->PortEdit->text().toInt(); //Как из функции Main получить доступ к форме?
Etu fignu pofiksil, vizvav funkciu iz LoginPage, kotoraya vernula mne strukturu s IP, Portom. Vse Ok.

Ostalos razobratsa kak menat parametri v forme iz drugih klassov. Podskajite

Не по теме:

Prostite za translit. Net na etoi mashine russkogo yazika

0
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 834
27.04.2017, 16:32 6
Во-первых. Перестаньте все писать с большой буквы. С большой буквы только имена классов. Объекты классов, имена переменных и названия функций - пишите с маленькой.
Так, как вы написали, по идее тоже должно работать. Слот - это обычная функция. И ее тоже можно вызывать напрямую из нужного объекта. Дебагером пробегались? Точно попадаете в функцию?

Добавлено через 8 минут
Все, разобрался с вашим трудночитаемым кодом. В функции main вы создаете два объекта - сначала Sample, затем loginPage. Второй - показываете. При этом внутри Sample вы создаете ЕЩЕ ОДИН новый (через new) объект loginPage. Его не показываете. И именно у него вызываете фукнцию-слот. В нем все работает, да. Но в первом, показанном объекте вы ничего не увидите.
Вам в мейне надо создать сначала логинФорму. Затем по указателю передать ее в конструктор Sampla. Но есть еще более простой вариант.
Прямо в мейне соединись их. Но для этого нужно в Sample добавить сигнал. И затем уже в мейне сделать что-то вроде:
C++ (Qt)
1
connect (UdpSample, &CatUdp::myCuteSignal, &w, &LoginPage::Autorized);
1
27.04.2017, 16:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.04.2017, 16:32
Помогаю со студенческими работами здесь

Разрешить доступ к методу класса только для другого класса
Здравствуйте, нужно что бы у Item ссылка на Box была только для чтения, но при добавлении Item в...

MFC, доступ к элементу класса (StatusBar) из другого класса
Здравствуйте. Я новичок и нигде не смог найти ответ на следующий видимо простой вопрос. Подскажите,...

Доступ к полям класса через переменные другого класса
Уважаемые коллеги! Почему в моделях Аnylogic для упрощения доступа к полям одного класса (класс А)...

Доступ к свойствам экземпляра класса из другого класса
Здравствуйте! У меня возникла программа с написанием программы на C#. &quot;Реализовать набор классов,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru