Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] не отображается QLabel


Автор: anatox91 24.3.2008, 15:22
захотелось мне вобщем сделать программу где на примере можно было бы посмотреть какой размер займет окно с определенными размерами (то есть прикинуть заранее, вдруг понадобится) и наткнулся на ошибку - после нажатия на кнопку должен создаваться QLabel с введенными размерами и отображаться, но ничего не отображается... код:

main.cpp
Код

#include <QtGui>
#include "size.h"

int main(int argc, char **argv) {
    QApplication app(argc, argv);
    SizeMainWindow *win = new SizeMainWindow;
    win->show();
    return app.exec();
}


size.h
Код

#ifndef SIZE_H_
#define SIZE_H_

#include <QtGui>

class SizeMainWindow : public QWidget {
public:
       SizeMainWindow(QWidget *parent = 0);
public:
       int x, y;
       QLineEdit *lineX;
       QLineEdit *lineY;
       QPushButton *create;
       QLabel *first;
       QLabel *second;
public slots:
       void CreateLabelWithSize();
};
#endif


size.cpp
Код

#include <QtGui>
#include "size.h"

SizeMainWindow::SizeMainWindow(QWidget *parent) : QWidget (parent) {
                                       setWindowTitle("Size Window");
                                       first = new QLabel("Enter a width:");
                                       second = new QLabel("Enter a height:");
                                       lineX = new QLineEdit;
                                       lineY = new QLineEdit;
                                       first->setBuddy(lineX);
                                       second->setBuddy(lineY);
                                       create = new QPushButton("Create");
                                       connect(create, SIGNAL(clicked()), SLOT(CreateLabelWithSize()));
                                       QIntValidator *validX = new QIntValidator(1, 1024, lineX);
                                       QIntValidator *validY = new QIntValidator(1, 768, lineY);
                                       lineX->setValidator(validX);
                                       lineY->setValidator(validY);
                                       QVBoxLayout *layout = new QVBoxLayout;
                                       layout->addWidget(first);
                                       layout->addWidget(lineX);
                                       layout->addWidget(second);
                                       layout->addWidget(lineY);
                                       layout->addWidget(create);
                                       setLayout(layout);
                                       resize(250, 200);
}
void SizeMainWindow::CreateLabelWithSize() {

     x = (lineX->text()).toInt();
     y = (lineY->text()).toInt();
     
     QLabel *window = new QLabel("This is window with size you enter");
     window->resize(x, y);
     window->show();
}


вероятно при передаче размеров окна где-то ошибка, только вот не допру где именно...

Автор: archimed7592 24.3.2008, 15:56
anatox91, возьми за правило: если что-то должно работать, но не работает: проверь connect'ы.
Я тебе сразу скажу, что этот connect
Цитата(anatox91 @  24.3.2008,  15:22 Найти цитируемый пост)
connect(create, SIGNAL(clicked()), SLOT(CreateLabelWithSize()));

будет возвращать false(т.е. ошибку), ибо по коду видно, что класс SizeMainWindow не имеет Q_OBJECT в private секции, но на будущее: всегда проверяй connect'ы, даже если всё рабоатет как полагается - сегодня работает, а завтра будешь долго искать ошибку.

Чтобы особо не напрягаться на этот счёт можно пользоваться макросом. Я пользуюсь таким:
Код

#define QT_CHECKED_CONNECT(src, sig, dest, sl) \
    { \
        bool connected = QObject::connect(src, sig, dest, sl); \
        assert(connected && "Qt meta-object connection problem"); \
    }

//...
QT_CHECKED_CONNECT(create, SIGNAL(clicked()), this, SLOT(CreateLabelWithSize());

Автор: JackYF 24.3.2008, 16:04
Ребят, мне вас жалко. Я два поста не понимал, в чём проблема посмотреть, удался ли connect. Под линухом Qt сама в случае неудавшегося коннекта пишет в консоль, какой коннект не удался и почему.

Автор: archimed7592 24.3.2008, 16:06
"Ubuntu user" - видимо не под каждым линухом пишет. Под виндой - так точно не пишет smile.

Автор: anatox91 24.3.2008, 16:08
archimed7592, спасибо за помощь... у меня просто какая-то тупая особенность допускать самые простые ошибки и не допирать где ошибка... зато теперь уж точно не забуду smile

Добавлено через 8 минут и 37 секунд
archimed7592, убунту у меня стоит в виртуалке, и пока только с ним разбираюсь, а пишу на винде, юзербарчик просто красивый нашел вот и поставил  smile 

Автор: JackYF 24.3.2008, 23:31
Э, ну дык надо из консоли проги запускать ;)

Автор: archimed7592 24.3.2008, 23:36
Жень, ну ты меня за имбецила то не держи ;).

Автор: JackYF 25.3.2008, 18:25
Цитата(archimed7592 @  24.3.2008,  22:36 Найти цитируемый пост)
Жень, ну ты меня за имбецила то не держи ;). 

Э, ну, как бы у меня и в мыслях не было, ты чего? smile Просто если из иксов напрямую запускать, то, думаю, вряд ли можно будет ошибки слотов увидеть, разве что в недрах .xerrors smile

Автор: SABROG 25.3.2008, 18:54
smile че вы страдаете с этой консолью ?

Код

void logOutput(QtMsgType, const char *);
QTextStream *out=0;
...
    if (QDir::current().exists(logpath) || QDir::current().mkpath(logpath) )
    {
    QFile *log = new QFile(logpath + "/log.txt");
        if ( log->open(QIODevice::WriteOnly | QIODevice::Append) ) 
        {
        out = new QTextStream(log);
        qInstallMsgHandler(logOutput);
        }
        else
        {
        delete log;
        qDebug("Can't open 'log.txt' file, all message will be output to debugger and console");
        }
    }
...
void logOutput(QtMsgType type, const char *msg)
{
     QString mes(msg);
     QString dt = QDateTime::currentDateTime().toString(QLatin1String("[dd.MM.yy hh:mm:ss] "));
     switch (type) 
     {
     case QtDebugMsg:
     dt += QLatin1String("[D]");
         break;
     case QtWarningMsg:
     dt += QLatin1String("[W]");
         break;
     case QtCriticalMsg:
     dt += QLatin1String("[C]");
         break;
     case QtFatalMsg:
     dt += QLatin1String("[F]");
     }
     (*out) << dt << QLatin1Char(' ') << QString::fromLocal8Bit(msg) << endl;
}


Автор: JackYF 25.3.2008, 20:21
Цитата(SABROG @  25.3.2008,  17:54 Найти цитируемый пост)
че вы страдаете с этой консолью ?

не знаю, я с ней не страдаю, она работает smile

SABROG, тоже вариант smile

Добавлено через 11 минут и 29 секунд

M
JackYF
anatox91, пора тебе прочитать правила раздела. Меточки [Qt], [GTK], [wx] и т.д. должны появляться у тем сами. Намёк ясен? :)

Автор: anatox91 25.3.2008, 20:42
JackYF, сорри, забыл  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)