Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: lighting от Декабрь 15, 2011, 16:50



Название: Проблема с дочерним классом
Отправлено: 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(&regionCaption, 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);

то должно получиться. А почему так - не знаю, может подскажут гуру.