KM
Sept. 21, 2020, 12:19 p.m.

виджет динамического размера в виджете постоянно заданого размера, цель: виджет родитель принимал размер виджета ребенка

ui, parent, child, setWidgetResizable

Добрый день, у меня есть виджет динамического размера (2) в виджете статического (1)(постоянно заданого размера), И мне бы хотелось чтобы виджет родитель принимал размер виджета ребенка(виджета который есть внутри него и имеет динамический размер)

Очень хотелось бы чтоб был простой способ реализации задуманого
код

  1. #include "errordialog.h"
  2. #include "errorstatus.h"
  3. #include "ui_errorstatus.h"
  4. #include <QDebug>
  5. #include <QTextBrowser>
  6.  
  7. ErrorStatus::ErrorStatus(QWidget *parent) :
  8. QWidget(parent),
  9. MenuElement(":/icons/img/error.png", nullptr, "0"),
  10. ui(new Ui::ErrorStatus)
  11. {
  12. ui->setupUi(this);
  13. timer = new QTimer(this);
  14. connect(timer, &QTimer::timeout, this, &ErrorStatus::checkForErrors);
  15. timer->start(settings.ErrorHandlerTimeOut.get()*1000);
  16. Global::errorHandler = this;
  17. agregator = new ErrorAgregator(this);
  18. ui->scrollArea->setWidgetResizable(true);
  19.  
  20. ui->scrollWidget->setStyleSheet("QWidget#scrollWidget {background-color: #282828; border-left: 2px solid rgb(85,150,255);}");//40,40,40
  21. ui->scrollArea->setStyleSheet("QScrollArea { background-color: #282828; border: 0;}");//40,40,40
  22. }
  23.  
  24. void ErrorStatus::checkForErrors() {
  25. clear(this->ui->horizontalLayout);
  26. Global::Alarm::turnOff(); //alarm noise
  27. QList<errorWidget*> textes;
  28.  
  29.  
  30. short errCount=0;
  31. foreach(ErrorAble *eventer, eventers) { //Przejdź po wszystkich eventerach (error eventerach)
  32. foreach(Error *error, eventer->errors) { //Przejdź po wszystkich błędach eventerów
  33. auto widget = new errorWidget(error, this->ui->contentWidget); //Stwórz widget błędu
  34. if(error->showInBar) { //Czy błąd ma być pokazany w status barze
  35. textes.push_front(widget);
  36. errCount++; //Zliczanie ilości błędów
  37. }
  38. if(!error->clicked && error->noticable) {
  39. if(settings.production.get()) Global::Alarm::turnOn(); //alarm noise
  40. }
  41. if(error->noticable && !error->noticed){ //Jeżeli ma być wyświetlony, a nie został
  42. agregator->add(error);//Wyświetl poprzez dodanie do listy
  43. error->noticed = true; //Ustaw jako wyświetlony
  44. Global::logger->add(*error); //Zloguj error
  45. if(!error->showInBar) eventers.removeOne(eventer);
  46. }
  47. if(error->lifetime>0) { //Jeżeli czas życia jest nieskończony
  48. error->currentLifeTime--; //Skróćmy czas życia
  49. if(error->currentLifeTime<=0) eventer->cancelError(*error); //Jeżeli czas życia dobiegł końca usuń błąd z listy
  50. }
  51. }
  52. }
  53.  
  54. if(errCount>0) getIcon()->setText("Błędy: "+QString::number(errCount)); //Zmień liczbę w menu jeżeli wystąpiły błędy
  55. else getIcon()->setText("Brak błędów"); //Jeżeli nie wykryto błędów wyświetl ich brak
  56.  
  57.  
  58. foreach(errorWidget *widg, textes) {
  59. this->ui->horizontalLayout->addWidget(widg);
  60. }
  61. this->ui->horizontalLayout->setSizeConstraint(QLayout::SetMinAndMaxSize);
  62. }
  63.  
  64. void ErrorStatus::clear ( QLayout* layout )
  65. {
  66. QLayoutItem* item;
  67. while ( ( item = layout->takeAt( 0 ) ) != nullptr )
  68. {
  69. delete item->widget();
  70. delete item;
  71. }
  72. update();
  73. }
  74.  
  75. void ErrorStatus::addEventer(ErrorAble *eventer) {eventers.append(eventer);}
  76. void ErrorStatus::removeEventer(ErrorAble *eventer) {eventers.removeAll(eventer);}
  77.  
  78. void ErrorStatus::abort()
  79. {
  80. foreach(ErrorAble *eventer, eventers) {
  81. eventer->resetErrors();
  82. }
  83. }
  84.  
  85. QWidget *ErrorStatus::getView(){return this;}
  86. ErrorStatus::~ErrorStatus(){delete timer;delete ui;}
2

Do you like it? Share on social networks!

1
Evgenii Legotckoi
  • Sept. 21, 2020, 2:03 p.m.

Добрый день!

Все классы, которые наследованы от QObject имеют метод parent() , вы можете попробовать сделать static_cast парент объекта и установить его размеры по контенту. Для этого служит метод adjustSize() .
Примерно так

  1. static_cast<QWidget*>(parent())->adjustSize();

    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