Вопросы по QT4 (Один осилить не могу)

Модератор: Модераторы разделов

Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Вопросы по QT4

Сообщение Assuri »

Вот участок кода:

Код: Выделить всё

void NumberField::paintRectangle()
{
    QPainter painter(this);
    painter.drawRect(QRect(200,200,100,100));
}

NumberField *field = new NumberField;
 field->setDefaultValue(0);
field->paintRectangle();

Программа компилируется нормально, но во время её работы выдается следующее сообщение:
QPainter::begin: Widget painting can only begin as a result of a paintEvent


Как исправить? Я конечно понимаю что значит эта фраза, но неужели мне всегда надо совершать какое-нибудь действие, чтобы что-нибудь нарисовать? О_о
Спасибо сказали:
elf74
Сообщения: 482
Статус: Линуксоид-Самовар :)
ОС: Mandriva Power Pack 2008.0 LCE

Re: Вопросы по QT4

Сообщение elf74 »

В каком режиме компилировали? В Release или Debug?
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: Вопросы по QT4

Сообщение Assuri »

elf74 писал(а):
30.07.2007 20:13
В каком режиме компилировали? В Release или Debug?

$qmake -project
$qmake
$make
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks
Контактная информация:

Re: Вопросы по QT4

Сообщение Alxn1 »

Хм. А при очередной перерисовке виджета всё, что вы нарисовали, просто пропадёт, скорее всего. Правильнее рисовать всё, что нужно при системном сообщении (в том самом paintEvent, т.е.), а в случае небходимости перерисовки генерировать это самое сообщение (repaint, кажется).
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: Вопросы по QT4

Сообщение Assuri »

Alxn1 писал(а):
30.07.2007 20:37
Хм. А при очередной перерисовке виджета всё, что вы нарисовали, просто пропадёт, скорее всего. Правильнее рисовать всё, что нужно при системном сообщении (в том самом paintEvent, т.е.), а в случае небходимости перерисовки генерировать это самое сообщение (repaint, кажется).

Эх.. ну ладно. Не такая уж это и беда.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Вопросы по QT4

Сообщение v04bvs »

-DooM- писал(а):
30.07.2007 19:56
Как исправить? Я конечно понимаю что значит эта фраза, но неужели мне всегда надо совершать какое-нибудь действие, чтобы что-нибудь нарисовать? О_о

см. repaint (или update, не помню).
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: Вопросы по QT4

Сообщение Assuri »

v04bvs писал(а):
30.07.2007 22:33
-DooM- писал(а):
30.07.2007 19:56
Как исправить? Я конечно понимаю что значит эта фраза, но неужели мне всегда надо совершать какое-нибудь действие, чтобы что-нибудь нарисовать? О_о

см. repaint (или update, не помню).

update()

Скажите, пожалуйста, в слотах нельзя передавать аргументы? А то я пишу:

Код: Выделить всё

PlayArea *playArea = new PlayArea;
connect(left,SIGNAL(clicked()),playArea,SLOT(move(0)));

, где

Код: Выделить всё

class PlayArea
{
.....
Q_OBJECT
public slots:
         void move( int );
.....
}

А ответ:
Object::connect: No such slot PlayArea::move(0)

Как так?
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Вопросы по QT4

Сообщение v04bvs »

-DooM- писал(а):
31.07.2007 08:01
Скажите, пожалуйста, в слотах нельзя передавать аргументы? А то я пишу:

А ответ:
Object::connect: No such slot PlayArea::move(0)

Как так?

То, что ты хочешь, называется closures, в С++ поддержки их нету.
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks
Контактная информация:

Re: Вопросы по QT4

Сообщение Alxn1 »

Не совсем понятно, причём тут closures, если тут сигналы-слоты используются Qt-ные. И таки да, уберите 0 из connect - оно должно бы заработать.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Вопросы по QT4

Сообщение Liksys »

За слоты можно дергать руками, передавая им аргументы или подключать их в коннектах, тогда все аргументы дает сигнал.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Вопросы по QT4

Сообщение v04bvs »

Alxn1 писал(а):
31.07.2007 13:05
Не совсем понятно, причём тут closures, если тут сигналы-слоты используются Qt-ные. И таки да, уберите 0 из connect - оно должно бы заработать.

Ну хочется написать (условно)
left.clicked.addSlot(function() { playArea.move(0); });
это (в общем случае) требует поддержки замыканий.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: Вопросы по QT4

Сообщение Assuri »

Или я чего-то не понимаю, или вы немного не поняли моего вопроса.

Дело в том, что когда я передаю функции, которая находится в SLOTе аргумент в виде числовой константы - появляется вот такая вот ошибка. Вместо 0 может быть любое число. Почему?
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Вопросы по QT4

Сообщение v04bvs »

-DooM- писал(а):
31.07.2007 19:38
Или я чего-то не понимаю, или вы немного не поняли моего вопроса.

Дело в том, что когда я передаю функции, которая находится в SLOTе аргумент в виде числовой константы - появляется вот такая вот ошибка. Вместо 0 может быть любое число. Почему?

Потому что этого нельзя сделать.
Я расскажу, как (примерно) работает макрос SLOT, может это поможет.
SLOT(myFunction(int))
возвращает "3myFunction(int)"
и всё.
Там нужно только указывать сигнатуру функции. Ни о какой передаче параметров и речи быть не может.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: Вопросы по QT4

Сообщение Assuri »

v04bvs писал(а):
31.07.2007 22:32
Потому что этого нельзя сделать.

Вот об этом я и спрашивал.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: Вопросы по QT4

Сообщение Assuri »

Скажите, пожалуйста, как установить фон кнопки QPushButton ? Смотрел в assistant все функции QPushButton и не нашёл...
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.
Контактная информация:

Re: Вопросы по QT4

Сообщение eduard_pustobaev »

-DooM- писал(а):
01.08.2007 10:33
Скажите, пожалуйста, как установить фон кнопки QPushButton ? Смотрел в assistant все функции QPushButton и не нашёл...

Background не знаю, но можно ведь пиктограмму использовать. А её уж разрисовуй как хочешь. Я не думаю, что во время работы программы необходимо часто менять надпись на баттоне, так что вполне неплохой вариант.

QPushButton::setIcon ( const QIcon & icon )

Хотя с другой стороны оно всё же наследник от QWidget и setPalette() никто не отменял.
В дисгармонии со вселенной.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: Вопросы по QT4

Сообщение Assuri »

eduard_pustobaev писал(а):
01.08.2007 14:34
Хотя с другой стороны оно всё же наследник от QWidget и setPalette() никто не отменял.

Абсолютно то, что нужно - спасибо.

Как вы думаете, чем лучше всего выводить числа и результат в калькуляторе: QPainter использовать или QLCDNumber( хотя это извращение какое-то )? Подскажите класс, который больше всего для этого подходит, а я в документации поищу.
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.
Контактная информация:

Re: Вопросы по QT4

Сообщение eduard_pustobaev »

-DooM- писал(а):
01.08.2007 18:06
Абсолютно то, что нужно - спасибо.

Как вы думаете, чем лучше всего выводить числа и результат в калькуляторе: QPainter использовать или QLCDNumber( хотя это извращение какое-то )? Подскажите класс, который больше всего для этого подходит, а я в документации поищу.


В калькуляторе? Типа kcalc? По мне так QLabel'а вполне хватит. Ну если с копипастом, то QLineEdit неплохо подошёл бы.

А вывести числа можно как угодно. Обожаю QString за setNum, toInt, toDouble.... :)
В дисгармонии со вселенной.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Вопросы по QT4

Сообщение Liksys »

QLineEdit.
Если хочется эффектов, то QLCDNumber.
QPainter в калькуляторе - это извращение, вестимо.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: Вопросы по QT4

Сообщение Assuri »

Liksys писал(а):
01.08.2007 18:34
QLineEdit.

Да, неплохо :)
Если хочется эффектов, то QLCDNumber.

Какие эффекты может обеспечить мне данный класс? Или, точнее, что в Вашем понимании "эффекты"?
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.
Контактная информация:

Re: Вопросы по QT4

Сообщение eduard_pustobaev »

-DooM- писал(а):
01.08.2007 19:10
Какие эффекты может обеспечить мне данный класс? Или, точнее, что в Вашем понимании "эффекты"?

Мигающее двоеточие? В экзамле с часиками было...
В дисгармонии со вселенной.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: Вопросы по QT4

Сообщение Assuri »

eduard_pustobaev писал(а):
01.08.2007 19:22
-DooM- писал(а):
01.08.2007 19:10
Какие эффекты может обеспечить мне данный класс? Или, точнее, что в Вашем понимании "эффекты"?

Мигающее двоеточие? В экзамле с часиками было...

Серьезный эффект :)

Возникла проблема:
Моя программа состоит из 7 файлов и 3 классов, а именно: MyWidget( в котором создаются объекты двух других классов и который помещает их в основной слой),Buttons( Формирует все кнопки ) и LineEdit. Они помещены в разные файлы. Мне надо установить connect между кнопками и QLineEdit, причем в зависимости от нажатой кнопки, но как это сделать, если все классы лежат в разных файлах? Конечно, можно создать в классах слоты и сигналы, но опять же не понимаю, как поймать сигнал, что была нажата именна та кнопка, а не другая?

Может быть вы знаете решение данной проблемы?
Спасибо сказали:
Аватара пользователя
panter_dsd
Сообщения: 157
Статус: Жаждущий знаний
ОС: Slackware 12
Контактная информация:

Re: Вопросы по QT4

Сообщение panter_dsd »

Не важно в каком файле лежат классы. Ты же создаешь экземпляр класса и его уже коннектишь.

#include <buttons>
#include <lineedits>

void nemo::nemo()
{
QMyButton* qmbButton1=new QMyButton();
QMyButton* qmbButton2=new QMyButton();
QMyLabel* qmbLabel=new QMyLabel();
connect(qmbButton1,SIGNAL(clicked()),qmbLabel,SLOT(clear()));
}

Если я правильно тебя понял. :)
А если нет, то выражайся яснее. :) :)

С уважением.
Пантер.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: Вопросы по QT4

Сообщение Assuri »

В главном классе MyWidget ( а точнее в конструкторе ) есть такие строчки:

Код: Выделить всё

Buttons *buttons = new Buttons;
    LineEdit *text = new LineEdit;

А в Buttons - 9 кнопок. Как мне приконектить с помощью указателей на объекты эти 9 кнопок к слотам LineEdit?

Например:

Код: Выделить всё

connect(one,SIGNAL(clicked()),text,SLOT(paste_one()));

Только вот проблема: "one" лежит в классе Buttons.
Спасибо сказали:
Аватара пользователя
panter_dsd
Сообщения: 157
Статус: Жаждущий знаний
ОС: Slackware 12
Контактная информация:

Re: Вопросы по QT4

Сообщение panter_dsd »

-DooM- писал(а):
01.08.2007 19:57
В главном классе MyWidget ( а точнее в конструкторе ) есть такие строчки:

Код: Выделить всё

Buttons *buttons = new Buttons;
    LineEdit *text = new LineEdit;

А в Buttons - 9 кнопок. Как мне приконектить с помощью указателей на объекты эти 9 кнопок к слотам LineEdit?

Например:

Код: Выделить всё

connect(one,SIGNAL(clicked()),text,SLOT(paste_one()));

Только вот проблема: "one" лежит в классе Buttons.

Объяви в классе buttons все кнопки как public и делай:
connect(buttons->one(),SIGNAL(clicked()),text,SLOT(paste_one()));

С уважением.
Пантер.
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.
Контактная информация:

Re: Вопросы по QT4

Сообщение eduard_pustobaev »

panter_dsd писал(а):
01.08.2007 20:01
Объяви в классе buttons все кнопки как public и делай:
connect(buttons->one(),SIGNAL(clicked()),text,SLOT(paste_one()));


Если сами баттоны сделать паблик, то скорее будет:

Код: Выделить всё

connect(buttons->!!!one!!!, SIGNAL(clicked()), text, SLOT(paste_one()));


Это если есть в баттонах такое:

Код: Выделить всё

public:
               QPushbutton *one;


Если неохота паблик кнопки делать, то можно накатать методов типа:

Код: Выделить всё

QPushButton *Buttons::getOne(){ return one; }


Тогда будет:

Код: Выделить всё

connect(buttons->!!!one()!!!, SIGNAL(clicked()), text, SLOT(paste_one()));
В дисгармонии со вселенной.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Вопросы по QT4

Сообщение Liksys »

Чет как-то не так.
У тебя все виджеты сгруппированы в три класса? Если да, то это не совсем правильный подход. Класс создает один виджет, который включает в себя остальные, то есть получается что-то вроде дерева.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: Вопросы по QT4

Сообщение Assuri »

Liksys писал(а):
01.08.2007 20:30
Чет как-то не так.
У тебя все виджеты сгруппированы в три класса? Если да, то это не совсем правильный подход. Класс создает один виджет, который включает в себя остальные, то есть получается что-то вроде дерева.

В программе у меня 2 класса: текстовое поле вывода и кнопки. А также есть еще один класс, который эти классы объеденяет.

Код: Выделить всё

QPushButton *zero = new QPushButton("&0");
connect(buttons->!!!zero!!!,SIGNAL(clicked()),text,SLOT(paste_the_one());

Ошибка:
mywidget.cpp:21: error: expected unqualified-id before ‘!’ token
mywidget.cpp:21: error: expected `)' before ‘;’ token
Спасибо сказали:
elf74
Сообщения: 482
Статус: Линуксоид-Самовар :)
ОС: Mandriva Power Pack 2008.0 LCE

Re: Вопросы по QT4

Сообщение elf74 »

-DooM- писал(а):
01.08.2007 10:33
Скажите, пожалуйста, как установить фон кнопки QPushButton ? Смотрел в assistant все функции QPushButton и не нашёл...

Как пример, если я правильно понял вопрос:

Код: Выделить всё

QPixmap pix("mybgrndfon.jpg");
QPushButton *pbtn = new QPushButton(&app)//app - объект приложения
pbtn -> resize(pix.size());
pbtn -> setPixmap(pix);
Спасибо сказали:
elf74
Сообщения: 482
Статус: Линуксоид-Самовар :)
ОС: Mandriva Power Pack 2008.0 LCE

Re: Вопросы по QT4

Сообщение elf74 »

-DooM- писал(а):
01.08.2007 19:10
Если хочется эффектов, то QLCDNumber.

Какие эффекты может обеспечить мне данный класс? Или, точнее, что в Вашем понимании "эффекты"?

"Эффекты" реализованные через метод

Код: Выделить всё

setSegmentStyle

передав в него, к примеру, одно из следующих значений:

Код: Выделить всё

QLCDNumber::OutLine
QLCDNumber::Flat
QLCDNumber::Filled


А зачем понадобился объединяющий класс? Механизм слотов и сигналов как раз для этого и был придуман, чтоб "соединят несоединимое" :D (шутка). Лучше укажите, что конкретно не компилится?
Спасибо сказали:
Ответить