Название: Проблема с дочерним классом
Отправлено: lighting от Декабрь 15, 2011, 16:50
Для удобного отображения растровой карты решил написать свой наследник от QWidget но почему-то при добавлении этот виджет не отображается Описания классов C++ (Qt) class Region : public QWidget { Q_OBJECT public: explicit Region(QRect boundingRect, QString& name, QString& maskFilePath, QWidget *parent = 0); signals: void clicked(); public slots: inline void setCaptionStyleSheet(QString style) {regionCaption.setStyleSheet(style);} void setRegionState(int state); void adjustCaptionSize(); void setCatpionFontSize(int pointSize); void regionClicked(); private: QWidget regionBg; QPushButton regionCaption; int regionState; }; class RegionMap : public QWidget { Q_OBJECT public: explicit RegionMap(QString mapConfigPath, QWidget *parent = 0); ~RegionMap(); signals: void regionClicked(int index); public slots: int loadFromFile(QString fileName); private slots: void regionClick(); private: static const int MAX_REGION_COUNT = 100; Region *regions[MAX_REGION_COUNT]; int regionCount; }; ... RegionMap *map;
Конструктор региона C++ (Qt) Region::Region(QRect boundingRect, QString& name, QString& maskFilePath, QWidget *parent) : QWidget(parent) { this->regionBg.setGeometry(boundingRect); regionBg.setMask(QPixmap(maskFilePath)); setRegionState(0); regionCaption.setText(name); regionCaption.setStyleSheet("QPushButton {font: bold; color: #2F358C; background: transparent;} QPushButton:pressed {padding-left: 2px;padding-top: 2px;color: #FABA77;}"); setCatpionFontSize(18); connect(®ionCaption, SIGNAL(clicked()), this, SLOT(regionClicked())); }
Конструктор карты C++ (Qt) RegionMap::RegionMap(QString mapConfigPath, QWidget *parent) : QWidget(parent) { loadFromFile(mapConfigPath); } int RegionMap::loadFromFile(QString fileName) { QSettings settings(fileName,QSettings::IniFormat); settings.setIniCodec(INI_CODEC_NAME); QString filename, name; int x, y, w,h; regionCount = settings.value("count",0 ).toInt(); if (regionCount>0) { for (int i = 1; i<=regionCount; i++) { if (i>MAX_REGION_COUNT) return -2; name = settings.value(QString("obj%1/name").arg(i), "").toString(); filename = settings.value(QString("obj%1/filename").arg(i), "").toString(); x = settings.value(QString("obj%1/x").arg(i), 0).toInt(); y = settings.value(QString("obj%1/y").arg(i), 0).toInt(); w = settings.value(QString("obj%1/w").arg(i), 0).toInt(); h = settings.value(QString("obj%1/h").arg(i), 0).toInt(); regions[i-1] = new Region(QRect(x, y, w, h), name, filename, this); connect(regions[i-1], SIGNAL(clicked()), this, SLOT(regionClick())); } return 0; } else return -1; }
Создаю карту C++ (Qt) map = new RegionMap("map.conf", ui->MonTab); map->setGeometry(10, 10, 1500, 900);
MonTab - вкладка QTabWidget родителей проверил, все верно присваивается но виджеты карты так и не появляются. В дебагере смотре map.isVisible == false show() не помогает. Пробовал добавить так-же обычный QPushButton - он сразу появился. Подскажите в чем может быть проблема, у меня гипотез больше не осталось.
Название: Re: Проблема с дочерним классом
Отправлено: trot от Декабрь 15, 2011, 17:22
Попробуй задать размер виджета resize-ом, и добавь к MonTab c помощью addTab
Название: Re: Проблема с дочерним классом
Отправлено: lighting от Декабрь 15, 2011, 20:35
MonTab это не QTabWidget, это его таб. так что addTab здесь не подойдет
Название: Re: Проблема с дочерним классом
Отправлено: lighting от Декабрь 16, 2011, 13:35
Сделал тестовый пример - отнаследовался от QWidget и в конструкторе добавил только setStyleSheet. Добавил из кода два виджета, один QWidget, другой мой MyWidget. Задал им одного родителя и один и тот-же styleSheet. QWidget отображается мой MyWidget нет - прям чудеса какие-то? :-[
Название: Re: Проблема с дочерним классом
Отправлено: lighting от Декабрь 16, 2011, 15:15
В исходном классе я у себя ошибку нашел - не задавался geometry для класса Region. Если добавить его и заменить QWidget на QLabel то все работает как надо. А вот почему сабкласс QWidget не отображается так пока и не разобрался.
Название: Re: Проблема с дочерним классом
Отправлено: trot от Декабрь 16, 2011, 21:18
Я тут поковырялся в исходниках, если установить атрибут у дочернего виджета, setAttribute(Qt::WA_StyledBackground, true);
то должно получиться. А почему так - не знаю, может подскажут гуру.
|