KM
24 сентября 2020 г. 13:27

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

QPushButton

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

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

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

2

Вам это нравится? Поделитесь в социальных сетях!

7
U
  • 24 сентября 2020 г. 16:56
  • (ред.)

Дело в том, что 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
    • 28 сентября 2020 г. 15:29
    • (ред.)

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

      Evgenii Legotckoi
      • 28 сентября 2020 г. 16:16
      • Ответ был помечен как решение.

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

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

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

        U
        • 29 сентября 2020 г. 15:09
        • (ред.)

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

          KM
          • 7 октября 2020 г. 15:57
          • (ред.)

          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
            • 7 октября 2020 г. 16:43

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

              Evgenii Legotckoi
              • 8 октября 2020 г. 3:51

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

                Комментарии

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