KM
Sept. 24, 2020, 1:27 p.m.

как скрыть елемент с копии виджета

QPushButton

Добрый день я копирую обект из другого класса, а именно

  1. auto widget = new errorWidget(error, this->ui->contentWidget); //Stwórz widget błędu

как я могу с копии убрать кнопку(X)? если пишу widget-X или errorWidget ->X QT ее не видит=(
тили хотя бы скрыть ее при этом не лезть в класс где она создавалась.
Просто этот виджет отображаеться в других местах у меня в программе
кстати кнопка создана не динамически а внутри виджета= виджет-виджет-кнопка

2

Do you like it? Share on social networks!

7
U
  • Sept. 24, 2020, 4:56 p.m.
  • (edited)

Дело в том, что ui класса находится в private-секции... И из-вне доступ получить, не нарушая канонов - не получится) Можно конечно сделать что-то в духе #define private public, но это для истинных извращуг))))

Первое, что пришло в голову:
В конструкторе Вашего errorWidget-виджета добавить булевскую переменную, которая будет собственно отвечать за то, видна ли кнопка Х или не видна)

И кнопка видна будет, когда

  1. auto widget = new errorWidget(error, this->ui->contentWidget, true); //Stwórz widget błędu

И скрыта, когда

  1. auto widget = new errorWidget(error, this->ui->contentWidget, false); //Stwórz widget błędu

А чтобы не править ранее работающие вызовы виджета, можно в конструкторе указать значение по умолчанию = true.
Тогда старые вызовы не придется переписывать)
А в новых уже укажете требуемое состояние)
Но я так чую, что придется подсказать еще и что в конструкторе писать? Там подправить-то немного придется... Чего Вы боитесь?)

    KM
    • Sept. 28, 2020, 3:29 p.m.
    • (edited)

    Вы меня не правильно поняли
    мне нужно скрыть X!
    как я могу с копии убрать кнопку(X)? если пишу widget-X или errorWidget ->X QT ее не видит=(

      Evgenii Legotckoi
      • Sept. 28, 2020, 4:16 p.m.
      • The answer was marked as a solution.

      Можете попробовать установить парента для виджета.
      Когда вы создаёте виджет

      1. new errorWidget(error, this->ui->contentWidget);

      То вы передаёте ему parent объект. Полагаю, что это this->ui->contentWidget . parent будет отвечать за то, внутри какого объекта находится создаваемый объект. Чтобы обращаться к созданным вручную виджетам, рекомендую сделать для них переменную, или вектор виджетов, чтобы можно было их куда-то сохранять, а ваше обращение через errorWidget->X не работает именно потому, что нет переменной, куда вы сложили этот виджет или метода, который достал бы созданный виджет из переменной или вектора виджетов.

        U
        • Sept. 29, 2020, 3:09 p.m.
        • (edited)

        Удалить пост нельзя... Поэтому удачки, Катту)

          KM
          • Oct. 7, 2020, 3:57 p.m.
          • (edited)

          Help

          include

          include

          include

          include

          include

          include "errorwidget.h"

          include "erroragregator.h"

          ErrorStatus::ErrorStatus(QWidget *parent) :
          QWidget(parent),
          MenuElement(":/icons/img/error.png", nullptr, "0"),
          ui(new Ui::ErrorStatus)
          {

          1. ui->setupUi(this);
          2. timer = new QTimer(this);
          3. connect(timer, &QTimer::timeout, this, &ErrorStatus::checkForErrors);
          4. timer->start(settings.ErrorHandlerTimeOut.get()*1000);
          5. Global::errorHandler = this;
          6. agregator = new ErrorAgregator(this);
          7. ui->scrollArea->setWidgetResizable(true);
          8.  
          9. ui->scrollWidget->setStyleSheet("QWidget#scrollWidget {background-color: #282828; border-left: 5px solid rgb(85,150,255);}");//40,40,40
          10. ui->scrollArea->setStyleSheet("QScrollArea { background-color: #282828; border: 0;}");//40,40,40
          11. errorWidget* widg2;
          12. //errorWidget->X->hide();

          }

          void ErrorStatus::checkForErrors() {
          clear(this->ui->horizontalLayout);
          Global::Alarm::turnOff(); //alarm noise

          1. QList<errorWidget*> textes;
          2.  
          3. short errCount=0;
          4. foreach(ErrorAble *eventer, eventers) { //Przejdź po wszystkich eventerach (error eventerach)
          5. foreach(Error *error, eventer->errors) { //Przejdź po wszystkich błędach eventerów
          6.  
          7. auto widget = new errorWidget( error, this->ui->contentWidget); //Stwórz widget błędu
          8.  
          9. if(error->showInBar) { //Czy błąd ma być pokazany w status barze
          10.  
          11. textes.push_front(widget);
          12.  
          13. errCount++; //Zliczanie ilości błędów
          14. //auto pos1 = this->mapToParent(this->rect().topLeft());
          15.  
          16. }
          17.  
          18. if(!error->clicked && error->noticable) {
          19. if(settings.production.get()) Global::Alarm::turnOn(); //alarm noise
          20. }
          21. if(error->noticable && !error->noticed){ //Jeżeli ma być wyświetlony, a nie został
          22. agregator->add(error);//Wyświetl poprzez dodanie do listy
          23. error->noticed = true; //Ustaw jako wyświetlony
          24. Global::logger->add(*error); //Zloguj error
          25. if(!error->showInBar) eventers.removeOne(eventer);
          26. }
          27. if(error->lifetime>0) { //Jeżeli czas życia jest nieskończony
          28. error->currentLifeTime--; //Skróćmy czas życia
          29. if(error->currentLifeTime<=0) eventer->cancelError(*error); //Jeżeli czas życia dobiegł końca usuń błąd z listy
          30.  
          31.  
          32. }
          33. }
          34. }
          35.  
          36. if(errCount>0) getIcon()->setText("Błędy: "+QString::number(errCount)); //Zmień liczbę w menu jeżeli wystąpiły błędy
          37. else getIcon()->setText("Brak błędów"); //Jeżeli nie wykryto błędów wyświetl ich brak
          38.  
          39.  
          40. foreach(errorWidget *widg, textes) {
          41. this->ui->horizontalLayout->addWidget(widg);
          42. }
          43. this->ui->horizontalLayout->setSizeConstraint(QLayout::SetMinAndMaxSize);

          }

          void ErrorStatus::clear ( QLayout* layout )

          {
          QLayoutItem* item;
          while ( ( item = layout->takeAt( 0 ) ) != nullptr )
          {

          1. delete item->widget();
          2.  
          3. delete item;
          4.  
          5.  
          6. }
          7.  
          8. update();

          }

          void ErrorStatus::addEventer(ErrorAble eventer) {eventers.append(eventer);}
          void ErrorStatus::removeEventer(ErrorAble
          eventer) {eventers.removeAll(eventer);}

          void ErrorStatus::abort()
          {
          foreach(ErrorAble *eventer, eventers) {
          eventer->resetErrors();
          }
          }

          QWidget *ErrorStatus::getView(){return this;}
          ErrorStatus::~ErrorStatus(){delete timer;delete ui;}

            KM
            • Oct. 7, 2020, 4:43 p.m.

            можеьте написать как это будеь в файлe .H?

              Evgenii Legotckoi
              • Oct. 8, 2020, 3:51 a.m.

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

                Comments

                Only authorized users can post comments.
                Please, Log in or Sign up
                • Last comments
                • AK
                  April 1, 2025, 11:41 a.m.
                  Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                • Evgenii Legotckoi
                  March 9, 2025, 9:02 p.m.
                  К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                • VP
                  March 9, 2025, 4:14 p.m.
                  Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                • ИМ
                  Nov. 22, 2024, 9:51 p.m.
                  Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                • Evgenii Legotckoi
                  Oct. 31, 2024, 11:37 p.m.
                  Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup