тем, кто писал что-нибудь на qt4. (вопрос 2)

Phoenix

новый вопрос:
как узнать, кто послал сигнал в слот?
или как создать свой сигнал наиболее просто, например у тестового поля (QLineEdit)
проблема такая:
есть много полей qlineedit, есть слот, который что-то делает, когда в поле нажимают enter, но то, что он делает, завит от того, из какого поля пришёл сигнал.
например:
есть slot Aslot.
есть два объекта QLineEdit edit1, edit2 (создаются они НЕ вручную!)
у них есть стандартный сигнал
void returnPressed
я вижу 2 пути.
первый:
из Aslot узнать, кто хозяин сигнала, изъять значение поля и дальше уже с ними работать.
(далее первый вопрос выше.)
второй:
сделать slot Bslot(QWidget* sender)
тогда нужно как-то сделать ещё один сигнал.
(далее встаёт второй вопрос.)
если идти по пути расширения QLineEdit, то я так понимаю, придётся окошки прорисовывать руками, что оооочень не хочется
==========
предисловие:
нужно написать простенькую программу с использованием одной библиотеки(уже написана).
что-то работало на винде и в линуксе.
версия qt4.3 или qt4.2
суть проблемы:
у меня стоит freebsd. код пишу в kdevelop. окошки рисую в qdesigner.
во-первых, qdesigner не хочет создавать такие файлы, которые компилятся(приходится всё писать руками без дезайнера)
во-вторых, библиотека не компилится под бсд, поэтому так или иначе нужно переходить куда-то.
что мне не ясно:
1) как прогать под qt под виндой. гугл выдал на удивление мало полезного
2) есть ли в сети qt для линухи. у соседа стоит мандрива. там не компилится нифига (т.е. создаёшь пустой проект в kdevelop, а он не собирается - жалуется на отсутсвие заголовочного файла. и его реально нет. в бсд c qt4.3 этот этап был пройден)
3) что делать с дизайнером в бсд. может я чего не так делаю. какую-нибудь галочку нужно поставить...
короче:
тем, кто смог создать окошко с 2 кнопочками под любой платформой с помощью qt4 просьба отметиться.

slonishka

2) есть ли в сети qt для линухи. у соседа стоит мандрива. там не компилится нифига (т.е. создаёшь пустой проект в kdevelop, а он не собирается - жалуется на отсутсвие заголовочного файла. и его реально нет. в бсд c qt4.3 этот этап был пройден)
наверное у соседа не стоит какого-нибудь пакета типа qt4-dev.
зачем тебе искать qt4 для линукс в сети? у мандривы же есть менеджер пакетов.

oliver11

1) как прогать под qt под виндой. гугл выдал на удивление мало полезного
http://trolltech.com/developer/downloads/qt/windows смотрел? Недавно ради интереса собирал под mingw, там есть примеры, какие-то утилиты для разработки.
P.S. Сам на Qt не пишу, ничего не знаю. :-)

Phoenix

qt4-dev
стоит. там заголовочных файлов много. но нет именно qcoreapplication
апд:он тоже есть. все заголовки лежат в /usr/lib/qt4/include/
это нормально?
где прописать в kdevelop, чтобы он этот путь подключил?
видать версия не та.
 
у мандривы же есть менеджер пакетов.

ну я предполагаю, что qt тяжеловат, хотя не знаю

slonishka

у меня столько:
bugaga ~ $ emerge -pv qt

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild NS ] x11-libs/qt-4.3.1 USE="gif jpeg opengl ... -xinerama" INPUT_DEVICES="-wacom" 42,109 kB

yulya

http://search.local/fastsearch.pl?what=qt+4.3.1+x11&file...
собираешь сам, устанавливаешь в /usr/local. Делаешь симлинки, чтобы при вызове qmake вызывался тот файл, что ты установил.
Это по второму вопросу

a10063

где прописать в kdevelop, чтобы он этот путь подключил?
kdevelop тут не причем, "подключает" путь qmake
поизучай внимательно генеренный qmake-ом мейкфайл и какие команды компиляции он там пишет (инклюды в gcc: -Ipath)
вообще, советую разбираться без kdevelop, чтобы лучше понимать происходящее
под виндой тоже просто - генерится проект для студии с помощью qmake, дальше она сама работает
дизайнер генерит обычные xml файлы, которые не зависят от платформы.
чтобы все работало правильно, главное - корректно создать проект qmake, указать там все cpp, h, ui

Ivan8209

> собираешь сам
Я думаю, что разработчики FreeBSD уже придумали, как сделать это
не самому. Если же они всё-таки не сподобились, то это сделали
за них разработчики NetBSD и DragonFlyBSD.
---
"Не изобретай велосипеды, их уже изобрели за тебя."
Leo

Ivan8209

> во-вторых, библиотека не компилится под бсд
Не знаю, откуда такая уверенность:

# $NetBSD: Makefile.common,v 1.5 2007/03/18 17:34:41 adam Exp $

DISTNAME= qt-x11-opensource-src-${QTVERSION}
CATEGORIES= x11
MASTER_SITES= ftp://ftp.trolltech.com/qt/source/ \
ftp://ftp.bero.org/pub/qt/source/

.include "../../x11/qt4/Makefile.common"


# $NetBSD: Makefile.common,v 1.8 2007/07/28 07:37:51 adam Exp $

QTVERSION= 4.3.0

MAINTAINER= NetBSD.org

Разворачивай pkgsrc, ports _на_самом_деле_ очень сильно отстают.
Location: http://pkgsrc.org/
---
"NetBSD is JIHBED!"

Phoenix

коммерческая библиотека не компилится.
qt компилится.

Ivan8209

Пробовал задействовать патчи из ports?
---
...Я работаю антинаучным аферистом...

Phoenix

новый вопрос:
как узнать, кто послал сигнал в слот?
или как создать свой сигнал наиболее просто, например у тестового поля (QLineEdit)
проблема такая:
есть много полей qlineedit, есть слот, который что-то делает, когда в поле нажимают enter, но то, что он делает, завит от того, из какого поля пришёл сигнал.
например:
есть slot Aslot.
есть два объекта qlineedit edit1, edit2 (создаются они НЕ вручную!)
у них есть стандартный сигнал
void returnPressed
я вижу 2 пути.
первый:
из Aslot узнать, кто хозяин сигнала, изъять значение поля и дальше уже с ними работать.
(далее первый вопрос выше.)
второй:
сделать slot Bslot(QWidget* sender)
тогда нужно как-то сделать ещё один сигнал.
(далее встаёт второй вопрос.)

eduard615

на 4 не писал, но думаю с 3 не сильно это место изменилось
как узнать, кто послал сигнал в слот?
стандартно — никак
или как создать свой сигнал наиболее просто, например у тестового поля (QLineEdit)
пронаследовать его и добавить свой сигнал
по сути: хороший путь — создать столько слотов, сколько lineedit'ов и приконнектить каждый к своему.
плохой путь — создать слот который будет принимать указатель на того, кто послал сигнал (как у тебя во втором пути). что бы понять, кто конкретно — либо пронаследовать lineedit и добавить свойство, по которому их различать, либо попробовать воспольвоваться qmetaobject и ometaproperty.

yulya

плохой путь — создать слот который будет принимать указатель на того, кто послал сигнал (как у тебя во втором пути). что бы понять, кто конкретно — либо пронаследовать lineedit и добавить свойство, по которому их различать, либо попробовать воспольвоваться qmetaobject и ometaproperty.
а чем этот путь плох?

class myQLineEdit: public QLineEdit {
...
signals:
void mySignal(myQLineEdit *from, ...);
}

использовать как

emit mySignal(this, ...);

а в приёмнике сравнивать этот указатель с известными указателями на myQLineEdit'ы, делать дело, а при отсутствии нужного вываливать исключение

olsonn

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

stat7984215

кстати, указатель нужен исключительно для того, чтобы узнать значение поля, так что если его включать в сигнал, то можно обойтись и включением необходимых переменных
ИМХО, в данном случае передача значения поля через параметр --- самый правильный путь

Phoenix

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

a10063

как узнать, кто послал сигнал в слот?
воспользоваться sender
(или я не понял вопрос )

Phoenix

дададада!

Phoenix

взялся я писать плагин для designer'a.
падает в кору, когда добавляешь на формочку..
(gdb) r
Starting program: /usr/local/bin/designer-qt4
warning: Unable to get location for thread creation breakpoint: generic error
[New LWP 100438]
[New Thread 0x8113000 (LWP 100529)]
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x8113000 (LWP 100527)]
QWidget::mapToGlobal (this=0x0, pos=@0x83b22c0) at qwidget.h:120
120 qwidget.h: No such file or directory.
in qwidget.h
(gdb)
более того простой коннект(connect ) делаю - падает:
(gdb) r
Starting program: /usr/home/igor/projects/vmk-ar5/aa1/build/aa1
warning: Unable to get location for thread creation breakpoint: generic error
[New LWP 100476]
[New Thread 0x8058000 (LWP 100317)]
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x8058000 (LWP 100317)]
0x2895dbee in QObject::connect (sender=0x3ff00000, signal=0x804daf4 "2returnPressed", receiver=0x8096080,
method=0x804dae8 "1onChange", type=Qt::AutoConnection) at kernel/qobject.cpp:2495
2495 kernel/qobject.cpp: No such file or directory.
in kernel/qobject.cpp
Current language: auto; currently c++
(gdb)
что не так?
qt ставил из портов.

Saimedy

проблема такая:
есть много полей qlineedit, есть слот, который что-то делает, когда в поле нажимают enter, но то, что он делает, завит от того, из какого поля пришёл сигнал.

стандартно — никак

Ложь и наглая провокация. Как раз для целей 'а есть QSignalMapper.
Оставить комментарий
Имя или ник:
Комментарий: