Russian Qt Forum

Qt => Общие вопросы => Тема начата: niXman от Февраль 23, 2010, 22:23



Название: Уникальный, жестко привязанный ID, для каждого контрола.
Отправлено: niXman от Февраль 23, 2010, 22:23
Всем хай!

Есть задумка, реализовать интерфейс программы таким образом, чтоб была возможность, для любого контрола использовать определенные правила/ресурсы для прорисовки.
Т.е. к примеру, на одной форме, QPushButton`ы должны иметь возможность выглядеть по разному.
Ресурсы хранятся в БД в виде таблиц стилей:
Код
INI
--------------------------
| unique_ID | QByteArray |
--------------------------
 
Пока рассматриваю такой вариант:
Каждому контролу присвоить уникальный ID, и, основываясь на нем, получать нужный для его прорисовки ресурс.

Но тут некоторые сложности.
Каким образом генерировать ID, с учетом того, что интерфейс будет расширяться?

В общем, интересно ваше мнение.
Спасибо за внимание.


Название: Re: Уникальный, жестко привязанный ID, для каждого контрола.
Отправлено: SABROG от Февраль 24, 2010, 03:08
Можно через QUuid QUuid::createUuid ()   [static]


Название: Re: Уникальный, жестко привязанный ID, для каждого контрола.
Отправлено: lit-uriy от Февраль 24, 2010, 06:18
niXman, у меня подобная задача, пока не решённая. Надо в БД хранить содержимое графич.сцены. Тоже в раздумьях.

В твоём случае, можно UI-файл хранить в БД и связанный именно с этим UI-файлом, файл стиля. Т.е. прям в виде BLOB'а.


Название: Re: Уникальный, жестко привязанный ID, для каждого контрола.
Отправлено: hackoff от Февраль 24, 2010, 08:55
Думаю идея должна пойдоти. Здесь я наследуюсь от QPushButton и добавляю методы     void setConnection(connectionTCP * connection) и
    connectionTCP* getConnection() с помощью которых можно добавить и получить указатель  на объекты connectionTCP. Думаю если заменить указатели на int, то можно каждому объекту ставить в соответствие свой ID.
mypushbutton.h
Код:
#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H

#include <QPushButton>
#include <QMutex>
#include "connectiontcp.h"
class myPushButton : public QPushButton
{
    Q_OBJECT;
public:
    myPushButton();
    void setConnection(connectionTCP * connection);
    connectionTCP* getConnection();

public slots:
    void setNamePush(QString name);
private:
    QMutex mutex;
    connectionTCP * pConnection;
    void focusInEvent(QFocusEvent * event);
    void focusOutEvent(QFocusEvent * event);

};

#endif // MYPUSHBUTTON_H


mypushbutton.cpp
Код:
#include "mypushbutton.h"
#include <QDebug>
#include <QIcon>
#include <QPixmap>

myPushButton::myPushButton()
    :QPushButton()
{
setFlat(true);
setIcon(QIcon(":/mycomputer.ico"));
setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed);
}

void myPushButton::setNamePush(QString name){
    setText(name);
}

void myPushButton::focusInEvent(QFocusEvent *event){
    setFlat(false);
    setMinimumSize(minimumSize()+QSize(0,100));
}

void myPushButton::focusOutEvent(QFocusEvent *event){
    setFlat(true);
    setMinimumSize(minimumSize()-QSize(0,100));
}

void myPushButton::setConnection(connectionTCP *connection){
    pConnection=connection;
}

connectionTCP* myPushButton::getConnection(){
    return pConnection;
}

хотя метод наверное относится к методам: "Почесать ухо, просунув руку через коленку"...


Название: Re: Уникальный, жестко привязанный ID, для каждого контрола.
Отправлено: waster от Март 08, 2010, 18:00
QAction::setData() или

bool QObject::setProperty( const char* name, const QVariant& value );

список свойств пихаем в отдельный файл и когда нужен новый контрол, тупо добавляем в конец файла новый "ID_CONTROL_newname new_№".

В принципе, каждому элементу списку можно сделать rand().

name тоже держим в отдельном файле соответствия имен с некими константами, написанными крупными буквами.

Потом пишем функции вида getControlIDByName(), getControlNameByID(), getControlPixmapByID(), etc и активно их юзаем вместо объектов самих контролов.

В идеале ещё можно создать глобальный менеджер таких объектов...

PS. На Маке это всё сделано уже в самой системе: каждый контрол уже имеет своё уникальный номер, надо лишь сделать обёртку.


Название: Re: Уникальный, жестко привязанный ID, для каждого контрола.
Отправлено: waster от Март 08, 2010, 18:03
Ну вот, конкретно QPushButton'ы хорошо Style Sheet'ся. Т.е. им перед показом окна можно нагрузить длинную строку из базы данных, которая полностью задаст их внешний вид.

Но Style Sheet не всегда удобно на 100% в других местах.


Название: Re: Уникальный, жестко привязанный ID, для каждого контрола.
Отправлено: niXman от Март 08, 2010, 21:46
waster, спасибо!
это лучший вариант!

вопрос закрыт.