Russian Qt Forum

Qt => Вопросы новичков => Тема начата: helga1917 от Август 07, 2013, 13:27



Название: НЕВИДНО ТЕКСТОВУЮ МЕТКУ
Отправлено: helga1917 от Август 07, 2013, 13:27
Компилируется, но не отображается текстовая метка, ПОЧЕМУ?

mainwindow.h:
Код:
 
#ifndef TOOL
#define TOOL

#include <QMainWindow>
#include <QHBoxLayout>
#include <QLabel>
#include <QtGui>

class MainWindow : public QMainWindow
{
Q_OBJECT
public :
      MainWindow (QWidget *parent=0);
};
#endif

mainwindow.cpp:
Код:
#include "mainwindow.h"
#include <QHBoxLayout>
#include <QLabel>
#include <QtGui>

MainWindow::MainWindow (QWidget *parent)
               : QMainWindow (parent)
{
QHBoxLayout *layout = new QHBoxLayout;
QLabel *label = new QLabel;
label->setText("text");
layout->addWidget(label);
setLayout(layout);
}


main.cpp:
Код:
#include "mainwindow.h"
#include <QApplication>
#include <QHBoxLayout>
#include <QLabel>
#include <QtGui>

int main (int argc, char argv[])
{
QApplication a (argc, argv);
MainWindow w;
w.show;

return a.exec();
}


Название: Re: НЕВИДНО ТЕКСТОВУЮ МЕТКУ
Отправлено: gil9red от Август 07, 2013, 14:04
Потому что QMainWidget немного отличается от простого виджета.
Для размещения на нем виджета, нужно указать setCentralWidget()

Изменив ваш код на:
Код:
MainWindow::MainWindow (QWidget *parent)
               : QMainWindow (parent)
{
QHBoxLayout *layout = new QHBoxLayout;
QLabel *label = new QLabel;
label->setText("text");
layout->addWidget(label);

QWidget *cWidget = new QWidget();
cWidget->setLayout(layout);

setCentralWidget(cWidget);
}

Или так:
Код:
MainWindow::MainWindow (QWidget *parent)
               : QMainWindow (parent)
{
QLabel *label = new QLabel;
label->setText("text");

setCentralWidget(label);
}


Название: Re: НЕВИДНО ТЕКСТОВУЮ МЕТКУ
Отправлено: helga1917 от Август 07, 2013, 14:13
Спасибо!


Название: Re: НЕВИДНО ТЕКСТОВУЮ МЕТКУ
Отправлено: helga1917 от Август 07, 2013, 15:08
Так как вы написали, все работает, а вот если  для QLabel сделать отдельный класс, то опять не видно метку:

mainwindow.h:
Код:
#ifndef TOOL
#define TOOL

#include <QMainWindow>
#include <QHBoxLayout>
#include <QLabel>


class CMW : public QMainWindow
{
Q_OBJECT
public :
      CMW (QWidget *parent=0);
};
#endif

klass.h:
Код:
#ifndef WIDGET
#define WIDGET

#include <QMainWindow>
#include <QLabel>

class Widget : public QLabel
{
  Q_Object
public: Widget (QWidget *parent=0);
};
#endif

mainwindow.cpp:
Код:
#include "mainwindow.h"
#include "klass.h"
#include <QHBoxLayout>
#include <QLabel>


CMW::CMW (QWidget *parent)
               : QMainWindow (parent)
{
Widget *label0 = new Widget;
setCentralWidget(label0);
}

klass.cpp:
Код:
#include "klass.h"
#include <QLabel>
#include <QtGuil>
Widget::Widget (QWidget *parent)
               : QLabel (parent)
{
QLabel *label = new QLabel;
label->setText("text");
QHBoxLayout *lay = new QHBoxLayout;
lay->addWidget(label);
QWidget *wid = new QWidget;
wid->setLayout(lay);
}


main.cpp:
Код:
#include "mainwindow.h"
#include <QApplication>
#include <QHBoxLayout>
#include <QLabel>
#include <QtGui>

int main (int argc, char argv[])
{
QApplication a (argc, argv);
CMW w;
w.show;

return a.exec();
}


Название: Re: НЕВИДНО ТЕКСТОВУЮ МЕТКУ
Отправлено: gil9red от Август 07, 2013, 15:25
Мне немного не понятно, для чего вы создаете наследника от QLabel и на этом наследнике хотите еще метку поставить :)

QLabel обычный виджет (в отличии от QMainWidget), и чтобы на него поместить другой виджет или виджеты, можно воспользоваться компоновщиками (layouts):
Код:
Widget::Widget (QWidget *parent)
               : QLabel (parent)
{
QLabel *label = new QLabel();
label->setText("text");

QHBoxLayout *lay = new QHBoxLayout();
lay->addWidget(label);

setLayout(lay); // устанавливаем наш компоновщик
}


Ну или максимально близкий к вашему коду вариант:
Код:
Widget::Widget (QWidget *parent)
               : QLabel (parent)
{
QLabel *label = new QLabel();
label->setText("text");

QHBoxLayout *lay = new QHBoxLayout();
lay->addWidget(label);

QWidget *wid = new QWidget();
wid->setLayout(lay);

QHBoxLayout *hBoxLayoutMain = new QHBoxLayout();
hBoxLayoutMain->addWidget(wid);

setLayout(hBoxLayoutMain); // устанавливаем наш компоновщик
}


Название: Re: НЕВИДНО ТЕКСТОВУЮ МЕТКУ
Отправлено: helga1917 от Август 07, 2013, 15:38
спасибо


Название: Re: НЕВИДНО ТЕКСТОВУЮ МЕТКУ
Отправлено: gil9red от Август 07, 2013, 15:52
Да пожалуйста :)


Название: Re: НЕВИДНО ТЕКСТОВУЮ МЕТКУ
Отправлено: Alex Custov от Август 07, 2013, 16:10
Код:
Widget::Widget (QWidget *parent)
               : QLabel (parent)
{
QLabel *label = new QLabel;
label->setText("text");
QHBoxLayout *lay = new QHBoxLayout;
lay->addWidget(label);
QWidget *wid = new QWidget;
wid->setLayout(lay);
}

Вы можете построчно объяснить что тут и зачем написано?


Название: Re: НЕВИДНО ТЕКСТОВУЮ МЕТКУ
Отправлено: helga1917 от Август 08, 2013, 09:04
Ну я пробовала создать отдельный класс для простого объекта QLabel, и подсоединить его, чтобы посмотреть что и как работает.

Код:
Widget::Widget (QWidget *parent)         //создаю класс Widget, который наследуется от QLabel
               : QLabel (parent)
{
QLabel *label = new QLabel;                 //объект label
label->setText("text");                        //добавляем ему текст
QHBoxLayout *lay = new QHBoxLayout; //горизонтальный компоновщик lay
lay->addWidget(label);                       //добавляем на горизонтальный компоновщик label
QWidget *wid = new QWidget;             //объект QWidget wid 
wid->setLayout(lay);                          //на этот объект добавляем компоновщик lay
}

была задумка вызвать объект Widget и назначить его виджетом главного окна

Код:
Widget *label0 = new Widget;
setCentralWidget(label0);