Russian Qt Forum

Qt => Общие вопросы => Тема начата: BuRn от Январь 25, 2012, 01:48



Название: connect QObject и т.д.
Отправлено: BuRn от Январь 25, 2012, 01:48
Есть класс, унаследованный от QMainWindow в нем естественно присутствует
Q_OBJECT
Есть другой класс, в котором ничего не наследуется, но проблема в том что хотелось бы иметь возможность использовать connect и прочее без QObject:: . Но класс который унаследован от QMainWindow наследуется и от моего класса, если я ставлю Q_OBJECT в мой класс, то компилятор ругается на то что не возможно такое, наследование класса несколько раз от QObject. Подскажите как решается эта проблема...
Прошу прощения за непонятки
Как - то вот так :
Код:
class qtPMK : public QMainWindow,public System
{
    Q_OBJECT

public:
    bool connectMySQL();
    void LoadLogins();
Код:
class System
{

public:
    QString message(MESSAGE);
// в нем хотелось бы использовать полноценно connect


Название: Re: connect QObject и т.д.
Отправлено: andrew.k от Январь 25, 2012, 02:30
ты что-то очень корявое хочешь сотворить.
Лучше расскажи зачем тебе это? Может путное че подскажут.

На сколько я могу предполагать, что ты хочешь получить, твой класс System должен быть полностью абстрактным.
Поэтому необходимости использовать в нем connect не может возникнуть.
А множественное наследование от QObject невозможно, но это ты уже похоже сам понял.


Название: Re: connect QObject и т.д.
Отправлено: kambala от Январь 25, 2012, 04:07
QObject - это не вселенское зло, от него можно (и нужно, если хочешь сигналы-слоты) наследоваться.

вместо множественного наследования сделай экземпляр класса System членом класса qtPMK.


Название: Re: connect QObject и т.д.
Отправлено: Sahab от Январь 25, 2012, 04:38
На сколько я могу предполагать, что ты хочешь получить, твой класс System должен быть полностью абстрактным.
таки уж прямо должен?

Цитировать
Поэтому необходимости использовать в нем connect не может возникнуть.
)))

Цитировать
А множественное наследование от QObject невозможно.
дану?)


Название: Re: connect QObject и т.д.
Отправлено: andrew.k от Январь 25, 2012, 05:01
Цитировать
А множественное наследование от QObject невозможно.
дану?)

Представьте себе!
Лучше бы полезное че написал.


Название: Re: connect QObject и т.д.
Отправлено: Igore от Январь 25, 2012, 09:24
Цитировать
Есть другой класс, в котором ничего не наследуется, но проблема в том что хотелось бы иметь возможность использовать connect и прочее без QObject:: . Но класс который унаследован от QMainWindow наследуется и от моего класса, если я ставлю Q_OBJECT в мой класс, то компилятор ругается на то что не возможно такое, наследование класса несколько раз от QObject. Подскажите как решается эта проблема...
http://developer.qt.nokia.com/doc/qt-4.8/moc.html (http://developer.qt.nokia.com/doc/qt-4.8/moc.html)
Множественное наследование от QObject запрещено, как тебе посоветовали
Цитировать
вместо множественного наследования сделай экземпляр класса System членом класса qtPMK.
При просто множественном наследование, первым должен идти QObject, Multiple Inheritance Requires QObject to Be First.


Название: Re: connect QObject и т.д.
Отправлено: KrupaKarlo от Январь 25, 2012, 09:39
В Шлее чуть ли не на первых страницах написано почему
Цитировать

class System
{

public:
    QString message(MESSAGE);

// в нем хотелось бы использовать полноценно connect


такое не работает. Реально на первых страницах все моменты о которых ты тут спросил расписаны.  :)


Название: Re: connect QObject и т.д.
Отправлено: Igors от Январь 25, 2012, 10:14
Если я правильно понял, хочется вынести какую-то ф-циональность в класс System, чтобы потом удобно "доливать" его (множественным наследованием) в нужные классы. Тогда может так

Код
C++ (Qt)
class System {      
 
System( QObject * obj = 0 }
{
  mObject = obj ? obj : new QObject;
  mShouldDel = (obj == 0);
}
 
QObject * GetSystemObject( void ) { return mObject; }
 
// data
QObject * mObject;
bool mShouldDel;
};
 
Для коннекта используем GetSystemObject. Для UI классов можно пользовать их собственный QObject, для др - создать "личный"

[/offtop]
Цитировать
А множественное наследование от QObject невозможно.
дану?)
Sahab, не покушайтесь на святое. Там написано что "так нельзя" - и на чтение были затрачены время и силы. Человек же не зря читал, понимать надо.


Название: Re: connect QObject и т.д.
Отправлено: Sahab от Январь 25, 2012, 11:53
а что кроме как множественного наследования от QObject проблему решить нельзя? и
Цитировать
твой класс System должен быть полностью абстрактным.
;D

Sahab, не покушайтесь на святое. Там написано что "так нельзя" - и на чтение были затрачены время и силы. Человек же не зря читал, понимать надо.
[/quote]
)) я в курсе про это, тоже доку читаю)... просто в "04:38" спать нужно было, а не...
упустил частичку
Цитировать
А множественное наследование от QObject невозможно
я конечно же имел в виду то что выразил Igore


Название: Re: connect QObject и т.д.
Отправлено: BuRn от Январь 25, 2012, 13:05
суть такая, что в классе System я читаю некоторую информацию с бд(логи), и в нем же , хотелось бы иметь функцию для работы с QTreeWidget , а именно что- то типа
ShowChangeOrders(QTreeWidget *w){
w->addChild(...);//и тут бла бла бла
}
вообщем а то что я хочу отобразить храню в списках класса System


Название: Re: connect QObject и т.д.
Отправлено: BRE от Январь 25, 2012, 14:20
BuRn, а как можно примешивать System с MainWindow? Это два совершенно разных объекта, имеющих совершенно разное назначение.
Ты же не примешиваешь к MainWindow QFile или QSqlDatabase?

Объект System лучше создавать отдельно и пусть он посылает сигналы, а MainWindow и другие объекты их ловят и обрабатывают.
 


Название: Re: connect QObject и т.д.
Отправлено: BuRn от Январь 25, 2012, 14:28
предлагаете в System сделать функцию взятия 1 моего лога из списка , а в классе который наследуется от QMainWindow отображать уже этот лог ?


Название: Re: connect QObject и т.д.
Отправлено: BRE от Январь 25, 2012, 14:33
предлагаете в System сделать функцию взятия 1 моего лога из списка , а в классе который наследуется от QMainWindow отображать уже этот лог ?

Пример, объект класса System при чтении новой строки лога эмитит сигнал:
emit message( str );

В MainWindow есть слот:
void appendMessage( const QString &str );
который добавляет эту строку в TreeView.

или

В System добавить сигнал logChanged( LogType ), а в MainWindow слот, в котором перечитывать из System весь лог нужного типа (который изменился).



Название: Re: connect QObject и т.д.
Отправлено: BuRn от Январь 25, 2012, 14:49
не совсем будет так верно, ибо у меня сразу загружаются 100+ записей , постоянно на каждую запись делать emit сигнал?


Название: Re: connect QObject и т.д.
Отправлено: BRE от Январь 25, 2012, 14:54
не совсем будет так верно, ибо у меня сразу загружаются 100+ записей , постоянно на каждую запись делать emit сигнал?
Генерируй сигнал после прихода всех записей и предоставь метод в System, через который можно получить этот список.


Название: Re: connect QObject и т.д.
Отправлено: Igore от Январь 25, 2012, 15:00
Цитировать
суть такая, что в классе System я читаю некоторую информацию с бд(логи), и в нем же , хотелось бы иметь функцию для работы с QTreeWidget , а именно что- то типа
ShowChangeOrders(QTreeWidget *w){
w->addChild(...);//и тут бла бла бла
}
вообщем а то что я хочу отобразить храню в списках класса System
Используй QTreeView со своей моделью, где будешь информировать View через стандартные методы.

Цитировать
не совсем будет так верно, ибо у меня сразу загружаются 100+ записей , постоянно на каждую запись делать emit сигнал?
Делай один emit (QStringList), или через свой тип, надо зарегистрировать его через qRegisterMetatype и спокойно использовать в signal/slot.


Название: Re: connect QObject и т.д.
Отправлено: BuRn от Январь 25, 2012, 15:00
а смысл тогда в сигнале? если можно что - то типа такого
Код:
QStringList System::GetListLogs{
...
return list_logs;
}
void qtPMK::ShowLogs(){
QStringList logs = GetListLogs();
...
}


Название: Re: connect QObject и т.д.
Отправлено: BRE от Январь 25, 2012, 15:06
а смысл тогда в сигнале? если можно что - то типа такого
Ну так эти строки как-то асинхронно добавляются, я полагаю. А как иначе тот-же MainWindow узнает что в списке произошло изменение?



Название: Re: connect QObject и т.д.
Отправлено: BuRn от Январь 25, 2012, 15:08
нет, есть 2 таких элемента treeWidget в 1 просто идет загрузка и отображение подробностей , в другом да, добавляются, но добавляются опять таки в список


Название: Re: connect QObject и т.д.
Отправлено: Igore от Январь 25, 2012, 15:24
Цитировать
а смысл тогда в сигнале? если можно что - то типа такого

Можно, signal/slot всего лишь делает связность меньше, можешь потом сделать считываение не из БД а из файла, и так же emit signal, добавить connect и все будет работать так же. GUI часть переделывать не надо, а если вызывать на прямую, то надо переделывать.
Код:
void qtPMK::ShowLogs(){
QStringList logs = SystemDB::GetListLogs();
//QStringList logs = SystemFile::GetListLogs();
}

Цитировать
нет, есть 2 таких элемента treeWidget в 1 просто идет загрузка и отображение подробностей , в другом да, добавляются, но добавляются опять таки в список

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


Название: Re: connect QObject и т.д.
Отправлено: BuRn от Январь 26, 2012, 00:07
ну в список в который постоянно добавляются записи, ничего не мешает делать что - то типа
addMessae(bla bla bla );
ShowChangeLogs(ui->treeWidget);