crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

История благодарностей участнику BRE ::: Спасибо сказали: 264 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
21.7.2009, 11:04 Qt и MySQL
Цитата(berserk @ 21.7.2009, 11:23) *
да. На моём рабочем компьютере где стоит QT, где собирается программа, где был собран драйвер БД всё прекрасно работает. А вот на другом компьютере который о QT ничего не знает не подключаются плагины. Основные библиотеки скопированные в папку с программой работают прекрасно.

В папке с программой создай папку sqldrivers и туда скопируй драйвер.
Подробности в assistent: How to Create Qt Plugins.
berserk,
16.7.2009, 19:07 собственная реализация hotplug на с++
Цитата(igor_bogomolov @ 16.7.2009, 20:04) *
Рад буду любым идеям, как реализовать подобный интерфейс. Сам пока не знаю с чего начать (((

Посмотри на HAL, вроде все уже укра... сделано до нас.
:)
igor_bogomolov,
13.7.2009, 14:49 boost graph library
BGL входит в состав boost с версии 1.18.0
http://www.boost.org/doc/libs
:)
AD,
8.7.2009, 7:52 Странное поведение программы
А куда buff указывает? Где память для него выделяется?

Код
if (*buff != '\n')
{
    str = str + *buff;
}
if (*buff == '\n')    // Здесь else не подходит?
{
    emit read_data(str);
    str = "";
}
berserk,
1.7.2009, 10:37 Создание быстродействующего распределителя памяти
Почитай вот эту тему. В конце есть готовый алокатор, с примером.
Стратегия там такая, выделяется один кусок памяти под 1K объектов (chunk), когда память в нем заканчивается, выделяется следующий chunk и т.д.

Блин, ссылку забыл приложить. :)
http://forum.sources.ru/index.php?showtopic=249933
AD,
30.6.2009, 14:08 Доступ к основному окну из плагина
Добавь в файл проекта самой программы:
QMAKE_LFLAGS += -Wl,-export-dynamic
exmagistr,
10.6.2009, 22:17 Ваш опыт собеседования.
Цитата(igor_bogomolov @ 10.6.2009, 20:28) *
Чему равно выражение записаное в префиксной нотации
+ * 12 - 34
Как такое решается?

Блин, сообразил. :)
Вообще выражение выглядит так: + * 1 2 - 3 4
-> (1 * 2) + (3 - 4) = 2 + -1 = 1
igor_bogomolov,
25.3.2009, 20:23 Непонятки с QPainter::viewport
Цитата(Rocky @ 25.3.2009, 20:15) *
ага,....
А можно как-то "беболезненно" отмаштабировать всю страницу? В смысле чтобы все данные уместились на странице? или лучше играться dpi и подобрав нужный коэффициент, например, устанавливать соотвествующее dpi на всех машинах?

Есть размер страницы в точках, есть размер в мм. Делим первое на второе - получаем коэффициент (количество точек в одном мм).
При формировании отчета все размеры задавай в мм, а для пересчета в точки умножай на получившийся коэффициент.
Rocky,
25.3.2009, 19:58 Непонятки с QPainter::viewport
Цитата(Rocky @ 25.3.2009, 19:48) *
Кто-нить знает, что вообще возвращает viewport? мм, см, пиксели? Почему так получается что на листе размером 297х210 мм на одной машине влезает все, а на другой происходит обрез? Как бороться?

viewport возвращает размер в пикселях.
У разных принтеров, разное разрешение в точках (это параметр "Количество точек на дюйм" (DPI)).
Тебе нужно все маштабировать относительно этого dpi.
Посмотри на QPaintDevice, это базовый класс для QPrinter.
Он тебе сможет вернуть размеры в мм, ну и сами значения dpi.
Rocky,
24.3.2009, 21:44 Делегаты...
Цитата(LE0N @ 24.3.2009, 21:02) *
Теперь спинбокс тоже с ноликом, но уже не редактируется, а вываливает ошибку в консоль:
QAbstractSpinBox: Internal error: Different types (QDateTime vs int) (widgets\qabstractspinbox.cpp:1864)

Попробуй изменить в делегате setEditorDate, пусть устанавливает фиксированную дату вместо проеобразования.
Плюс во все методы повтыкай побольше qDebug() и посмотри, что происходит.

Эта ошибка из QVariant operator+( const QVariant &arg1, const QVariant &arg2 ).
Возникает, если типы аргументов разные.
LE0N,
24.3.2009, 17:41 Межпоточное взаимодействие (Qt 4.3.3)
Цитата(flankerr @ 24.3.2009, 17:32) *
ну т.е. моё предыдущие утверждение верно?

тогда другой вопрос - это утверждение верно только если объект посылающий сигнал создан от клаасса унаследованного от QThread ?
или (ну а вдруг) прокатит множественное наследовнаие QObject для сигнала и некий другой класс потока (не Qt) ??

Есть два объекта, например наследника от Object, созданные в контекстах двух разных потоках.
Когда один объект посылает сигнал второму, происходит следующее:
в очередь сообщений той нити, где находиться получатель сигнала, помещается специальное сообщение (QEvent::MetaCall), в котором содержиться информация для вызова слота. После переключения в контекст получателя (при обработке procrssEvents) происходит вызов данного слота.
flankerr,
24.3.2009, 17:23 Межпоточное взаимодействие (Qt 4.3.3)
Цитата(flankerr @ 24.3.2009, 17:22) *
кто создан?

Объект, слот которого будет выполняться.
flankerr,
19.3.2009, 17:43 [Решено] Cоздание собственной модели для отображения таблицы.
Цитата(AD @ 19.3.2009, 17:37) *
А вообще вот почему указатель, а не объект:
1) Данные могут со временем измениться, чтобы если что создать потомка.
2) Описан класс в другом файле - меньшее количество компиляции.

Аргумент 2 - можно обойти.
Аргумент 1 - если есть такая необходимость, то конечно. (Я к этой структуре относился как к вспомогательно/внутренней).

Ухожу, ухожу.... :D ;)

Ан нет, еще про одну штучку напомню: ;)
Цитата из assistant

Цитата
void qDeleteAll ( ForwardIterator begin, ForwardIterator end )
Deletes all the items in the range [begin, end) using the C++ delete operator. The item type must be a pointer type (for example, QWidget *).
Example:
QList<Employee *> list;
list.append(new Employee("Blackpool", "Stephen"));
list.append(new Employee("Twist", "Oliver"));

qDeleteAll(list.begin(), list.end());
list.clear();
Notice that qDeleteAll() doesn't remove the items from the container; it merely calls delete on them. In the example above, we call clear() on the container to remove the items.
See also forward iterators.
void qDeleteAll ( const Container & c )
This is an overloaded member function, provided for convenience.
This is the same as qDeleteAll(c.begin(), c.end()).

AD,
19.3.2009, 16:58 [Решено] Cоздание собственной модели для отображения таблицы.
Цитата(AD @ 19.3.2009, 16:36) *
class StatisticModel: public QAbstractTableModel
{
    Q_OBJECT

private:
    QList<LicenceData*> listView;        ///< список указателей на данные о лицензии

...

}

Вот объясни мне, для чего используются указатели на LicenceData, а не сами объекты? ;)
Где они удаляются, после разрушения объекта StatisticModel.
Сейчас у тебя память будет утекать.

А описал бы список так QList<LicenceData> listView и проблем бы не было.
В чем тайный смысл? ;)
AD,
19.3.2009, 12:11 [Решено] Cоздание собственной модели для отображения таблицы.
Раскрывающийся текст

/// Класс модели для отображения статистики созданных лицензий
/// [BRE] Для чего ты наследуешься от QSqlTableModel. Эта модель тебе нужна в одной функции createList для формирования списка?
/// IMHO наследоваться лучше от QAbstractTableModel.
class StatisticModel: public QSqlTableModel
{
    Q_OBJECT

private:
    // [BRE] Для чего указатели? И если указатели, где удаляются объекты LicenceData при разрушении StatisticModel
    QList<LicenceData*> listView;        ///< список указателей на данные о лицензии
    QStringList listClmNames;            ///< список названий столбцов

private:
    void addDataTable(LicenceData* view, const QString& lic_name, const QString& path, const QDateTime& date,
                const QString& serialNumber, const uint& id);
    void createList();

public:
    StatisticModel(QObject *parent = 0, QSqlDatabase db = QSqlDatabase());
    ~StatisticModel();
    virtual Qt::ItemFlags flags(const QModelIndex &index) const { return Qt::ItemIsEnabled | Qt::ItemIsSelectable; }
    virtual int rowCount(const QModelIndex& parent = QModelIndex()) const { return listView.size(); }
    virtual int columnCount(const QModelIndex& parent = QModelIndex()) { return listClmNames.size(); }
    virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
    virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
};


StatisticModel::StatisticModel(QObject *parent, QSqlDatabase db): QSqlTableModel(parent, db)
{
    // [BRE]
    // setTable(QString("LogLicence"));
    createList();
}

StatisticModel::~StatisticModel()
{}

/// Добавление в элемент строки таблицы представления view данных
void StatisticModel::addDataTable(LicenceData* view, const QString& lic_name, const QString& path,
            const QDateTime& date, const QString& serialNumber, const uint& id)
{
    view -> licenceName(lic_name);
    view -> licencePath(path);
    view -> createDate(date);
    view -> addID(id);
    view -> addNum(serialNumber);
}

/// Создание списка данных о лицензиях
void StatisticModel::createList()
{
    // [BRE] Модель для доступа к таблице нужна только в этой функции.
    QSqlTableModel model;
    model.setTable( "LogLicence" )
    model.select();

    for(register int row=0; row < model.rowCount(); ++row)
    {
    // [BRE] Я бы сделал как-то так. :)
    QSqlRecord rec = model.record( row );
    if( rec.isEmpty() )
        continue;    // или break;

        QDateTime date( rec.value( "create_date" ).toDateTime() );
        QString fullNameLic( rec.value( "licence_name" ).toString() );
        QString serialNumber( rec.value( "serialnumber" ).toString() );
        if(fullNameLic.isEmpty() || serialNumber.isEmpty() || !date.isValid())
            break;

    [BRE] Не углублялся.... :)
        if(row > 0)
        {
            if(date.toTime_t() == model.record(row - 1).value(QString("create_date")).toDateTime().toTime_t() &&
                fullNameLic == model.record(row - 1).value("licence_name").toString() &&
                serialNumber != model.record(row - 1).value("serialnumber").toString())
            {
                listView.last() -> addNum(serialNumber);
                listView.last() -> addID(model.record(row).value(0).toUInt());
            }
            else
            {
                QString lic_name(QFileInfo(fullNameLic).fileName()), path(QFileInfo(fullNameLic).path()
                            + QDir::separator());
                LicenceData* view(new LicenceData());
                addDataTable(view, lic_name, path, date, serialNumber, model.record(row).value(0).toUInt());
                listView.append(view);
            }
        }
        else
        {
            QString lic_name(QFileInfo(fullNameLic).fileName()), path(QFileInfo(fullNameLic).path()
                            + QDir::separator());
            LicenceData* view(new LicenceData());
            addDataTable(view, lic_name, path, date, serialNumber, record(row).value(0).toUInt());
            listView.append(view);
        }
    }
}

/// Возвращает данные о лицензии в зависимости от индекса и роли
QVariant StatisticModel::data(const QModelIndex& index, int role) const
{
    if(!index.isValid() || role != Qt::DisplayRole)
        return QVariant();

    // [BRE] IMHO, не нужная проверка, ведь ты возвращаешь количество строк == listView.size()
    if(index.row() >= listView.size())
        return QVariant();

    // [BRE] Код не ясен. Ты получаешь указатель на LicenceData и в зависимости от index.column() должен вернуть значение из нужного поля
    // этой структуры
    LicenceData* d = listView.at(index.row());
    return listView.at(index.row());
}

/// Возвращает данные о заголовках таблицы
QVariant StatisticModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if(role != Qt::DisplayRole)
         return QVariant();

    QString result("");
    if(orientation == Qt::Horizontal && !listClmNames.isEmpty())
    {
        result = listClmNames.at(section);
        return QVariant(result);
    }
    else
        return QSqlTableModel::headerData(section, orientation, role);
}

AD,
18.3.2009, 14:21 [Решено] Cоздание собственной модели для отображения таблицы.
LicenceModel

struct LicenceData
{
    QString licence_name;    ///< название лицензии
    QString path;        ///< путь, по которому лежит данная лицензия
    QDateTime date;        ///< дата создания лицензии
    QStringList list_numbers;    ///< список серийных номеров лицензии
    QList<uint> list_id;    ///< список id-шников данных серийных номеров
};

typedef QList<LicenceData> LicenceList;

class LicenceModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    ActionModel( const LicenceList &actions, QObject *parent = 0 );

    // В зависимости от указанного индекса и роли возвращает данные о лицензии (берет все из m_licences)
    virtual    QVariant        data( const QModelIndex &index, int role ) const;

    // Возвращает флаги ячейки (return Qt::ItemIsEnabled | Qt::ItemIsSelectable;)
        virtual    Qt::ItemFlags        flags( const QModelIndex &index ) const;

    // Возвращает имена секций (берет из списка m_columnNames, который формируется в конструкторе модели)
        virtual    QVariant        headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const;

    // Возвращает число строк (return m_licences.size();)
    virtual    int            rowCount( const QModelIndex &parent = QModelIndex() ) const;
    // Возвращает число столбцов (return m_columnNames.size();)
    virtual int            columnCount( const QModelIndex &parent = QModelIndex() ) const;

private:
    QStringList    m_columnNames;            //!< Список строк с названием столбцов.
    LicenceList    m_licences;            //!< Список данных о лицензиях.
};



В данном примере ты должен заполнить список лицензий извне, модель будет использовать его для вывода.
Можно переделать и формировать этот список в конструкторе.
Можно в самой моделе читать данные из БД.
Все можно. ;)
AD,
17.3.2009, 9:52 QSqlTableModel+QListView добавление новой записи вручную...
Цитата(LE0N @ 17.3.2009, 9:43) *
Да хоть так пишу... Разницы НОЛЬ!

Как и писал раньше, сам QSqlTableModel не пользуюсь, но вот цитата из assistent:
Раскрывающийся текст

Цитата
Use QSqlTableModel::record() to retrieve a row in the table, and QSqlTableModel::setRecord() to modify the row. For example, the following code will increase every employee's salary by 10 per cent:
for (int i = 0; i < model.rowCount(); ++i) {
QSqlRecord record = model.record(i);
double salary = record.value("salary").toInt();
salary *= 1.1;
record.setValue("salary", salary);
model.setRecord(i, record);
}
model.submitAll();
You can also use QSqlTableModel::data() and QSqlTableModel::setData(), which are inherited from QAbstractItemModel, to access the data. For example, here's how to update a record using setData():
model.setData(model.index(row, column), 75000);
model.submitAll();
Here's how to insert a row and populate it:
model.insertRows(row, 1);
model.setData(model.index(row, 0), 1013);
model.setData(model.index(row, 1), "Peter Gordon");
model.setData(model.index(row, 2), 68500);
model.submitAll();
Here's how to delete five consecutive rows:
model.removeRows(row, 5);
model.submitAll();
The first argument to QSqlTableModel::removeRows() is the index of the first row to delete.
When you're finished changing a record, you should always call QSqlTableModel::submitAll() to ensure that the changes are written to the database.

LE0N,
17.3.2009, 8:17 MinGW32, Статическая и динамическая сборка, *.dll и *.a
Цитата(Litkevich Yuriy @ 17.3.2009, 0:14) *
т.е. в случае сборки Qt с разделяемыми библиотеками, при компиляции моей программы эти a'шки линкером присоеденяются к объектникам моей программы и потом получается exe'шник?

Да.
Если я не ошибаюсь, dll можно вообще убрать, а линкер программу все равно соберет. dll нужны будут только при исполнении программы.
Litkevich Yuriy,
16.3.2009, 23:55 MinGW32, Статическая и динамическая сборка, *.dll и *.a
Цитата(Litkevich Yuriy @ 16.3.2009, 23:33) *
Если это все так, то у меня вопрос, а зачем при сборке с разделяемыми библиотеками в каталоге %QTDIR%\lib создается море a'шек?

Это разные статические библиотеки (и размеры у них очень разные).
При сборке с разделяемыми библиотеками создается dll и a (не большой), вот .а содержит код-переходник для вызова функций из dll.
А при статической сборке в .a находится весь код функций.
Litkevich Yuriy,
16.3.2009, 22:35 [Решено][Qt 4.5] QRubberBand крашится
Цитата(SABROG @ 16.3.2009, 22:19) *
Решил поэкспериментировать с QRubberBand, почитал в доке. Накатал простейший код, как в документации. Когда дело доходит до setGeometry() или show(), то программа крашится. Проверьте плиз на ранних версиях или скажите причину подобного поведения. Компилируемые исходники в аттаче.

Ты в конструкторе Widget переменную rubberBand обнуляй и все будет ok.
SABROG,
16.3.2009, 19:00 При помощи какого виджета лучше сделать mailto?
Цитата(kuler @ 16.3.2009, 18:46) *
ну где в дизайнере цвет шрифта?

label->setText( "<font color=red>Пишите</font> мне <font color=green>письма</font>" );

А в дизайнере если нажать правую кнопку мыши и выбрать change rich text...
kuler,
14.3.2009, 22:18 Изменение высоты и ширины ячеек.
Цитата(BRE @ 14.3.2009, 21:19) *
Поглядим.


main.cpp

#include <QApplication>
#include <QStandardItemModel>
#include <QTableView>
#include <QHeaderView>
#include "CItemDelegate.h"

int main( int argc, char *argv[] )
{
        QApplication app( argc, argv );

        QStandardItemModel model( 4, 2 );
        for( int row = 0; row < 4; ++row )
        {
                for( int column = 0; column < 2; ++column )
                {
                        QModelIndex index = model.index( row, column, QModelIndex() );
                        model.setData( index, QVariant( (row+1) * (column+1) ) );
                }
        }

        QTableView tableView;

        CItemDelegate delegate( &tableView );
        tableView.setItemDelegate( &delegate );

        tableView.setModel( &model );
        tableView.resizeColumnsToContents();
        tableView.resizeRowsToContents();

        tableView.show();

        return app.exec();
}

Antrix,
13.3.2009, 18:31 Как измерить величину строки в пикселях при печати?
Цитата(kwisp @ 13.3.2009, 18:25) *
Rocky,
QPainter должен тоже это уметь. я так считаю.

Кое что он умеет:
QRectF QPainter::boundingRect( ... )
Rocky,
13.3.2009, 13:09 Секреты и интересные возможности Qt
Цитата(SABROG @ 27.2.2009, 10:08) *
Еще один способ вывода отладочных сообщений для GUI приложений. Позволяет не прописывать CONFIG += console в .pro файле.
На qDebug, qWarning, QFatal будет всплывать диалог, вместо того, чтобы писаться в консоль.

А еще можно перехватить весь вывод и писать его в лог-файлы, например.

QtMsgHandler qInstallMsgHandler ( QtMsgHandler handler )
В документации есть пример использования.

В проекте freeremote, я все строки добавляю в QStringListModel, что дает возможность в необходимых местах сделать просмотр лога, просто создав QListView и указав эту модель в качестве активной.
AD,
12.3.2009, 22:35 QApplication::quit() не срабатывает?
Цитата(LE0N @ 12.3.2009, 22:30) *
Давайте перейдём от первоначального вопроса к
Цитата
запустить loader->process после a.exec без участия пользователя...



В конструкторе Loader:
QTimer::singleShot( 0, this, SLOT( process() ) );

Таймер сработает сразу после запуска цикла обработки событий.
process() - должен быть слотом.

Да, из main вызов process убрать.
LE0N,

11 страниц V  « < 8 9 10 11 >
RSS Текстовая версия Сейчас: 19.4.2024, 6:47