crossplatform.ru

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

История благодарностей участнику Litkevich Yuriy ::: Спасибо сказали: 769 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
27.11.2015, 12:48 Совместимость скомпилированой библиотеки с другой версией Qt
Описание для Qt4, для Qt5 по идее ничего не должно изменится (подробнее ищи в её документации
MishaUA,
13.11.2015, 10:27 QTableWidgetItem и QTreeWidgetItem
Цитата(Ponchikus @ 12.11.2015, 21:17) *
Скажите, это корректное удаление элемента ?
нет, в справке:
QTreeWidgetItem *item= tree->currentItem();

QTreeWidgetItem *parent = item->parent();
     int index;

     if (parent) {
         index = parent->indexOfChild(tree->currentItem());
         delete parent->takeChild(index);
     } else {
         index = treeWidget->indexOfTopLevelItem(tree->currentItem());
         delete tree->takeTopLevelItem(index);
     }


Разные вопросы следует задавать в разных темах, для тех кто ищет ответы поиском, для них так много удобнее, чем разгребать кашу внутри одной темы
Ponchikus,
28.10.2015, 20:15 Чтение .txt файла, сохраненного в кодировке UTF-8
а куда выводишь? в винде в командную строку?
Тогда конвертируй QString к "IBM-866"

QTextCodec *outCodec = QTextCodec::codecForName("IBM-866"); // Добавь
...
qDebug() << outCodec->fromUnicode(stream.readLine()); // Измени
aqt,
27.10.2015, 12:25 Перевести QVariant обратно в мой указатель на объект
Цитата(kruger @ 27.10.2015, 12:51) *
Я его засовываю в QVariant таким образом:
QVariant::fromValue<QObject *>(pStatus);
а зачем ты к QObject * приводишь? Так ты из QVariant-а только указатель на QObject и сможешь вынуть.

См. доку по
T QVariant::value () const
и void QVariant::setValue ( const T & value )
Этого достаточно
kruger,
25.10.2015, 8:02 Lime Report - Qt генератор отчетов
Два замечания:
1) чтобы демка собралась с Qt4 нужно поправить код [attachment=1939:patch0.zip]
2) С дизайнером не разобрался, какое-то месиво из полей наложенных друг на друга, не понятно как это создано, как будет выглядеть и как редактировать.
TEHb,
19.1.2015, 20:41 Программа для "Умного дома"
Напрашивается сделать класс описывающий и устройство и виджет для его управления.
Добавление устройства - создание экземпляра класса (объекта), отображение странички с его настройками вызовом функции класса widget(), которая создаст виджет со всем его содержимым и вернёт указатель.

Ну а данные хранить в виде полей этого класса (вместо отдельной структуры.

Если класс обозвать Device, то список устройств: QList<Device*>

class Device: public QObject
{
Q_OBJECT

    explicit Device(QObject parent=0);
    ~Device(){}
    
    
    QWidget* widget();
    
    void setData1(Type1 value);
    Type1 data1();
    //...
    void setDataN(TypeN value);
    TypeN dataN();


private:
    Type1 _data1;
    // ...
    TypeN _dataN;

}
Наследник QObject, авдруг тебе в будущем сигналы и слоты понадобятся, чтобы тотально проект не пересобирать, лучше уж сразу.
casper17,
9.12.2014, 20:07 Странная работа QSettings с QTextCodec и BOM
Меня реализация QSettings бесит давно и основательно.
Всё что нужно было сделать это конструктор:
QSettings ( const QIODevice & iodevice, QObject * parent = 0 )
вместо
QSettings ( const QString & fileName, Format format, QObject * parent = 0 )

тогда мы могли бы читать файл в QBuffer предварительно преобразовав кодировку (но внутрянка получается сложнее, поэтому делать так троли не стали).

Выход из положения - зарегистрировать свой формат, через
registerFormat()

по сути создаёшь две функции, чтения и записи из/в файла и регистрируешь их связывая с условным форматом.
В функция чтения/записи реализуешь механизм перекодирования.
В общем-то не сложно и можно эту кухню вынести в отдельную пару .cpp/.h
kin63camapa,
19.9.2014, 11:07 QRadioButton autoExclusive
[attachment=1873:screen_radiobutton.png]
[attachment=1874:radiobutton.ui.zip] (отрежь фиктивное расширение)

П.С. делал в Qt 4.7.4
lanz,
3.9.2014, 11:39 перетаскивание группы виджетов
Цитата(borune @ 2.9.2014, 20:33) *
Первой идеей было использовать QDockWidget, но при перетаскивании они не меняются местами, а добавляются рядом, образуя вкладки.
меняются, поведение зависит от настроек.
Запустите "Example and Demos" выберите пункт "Demonstrations" -> "Mainwindow"
потаскайте DockWidget-ы
[attachment=1869:screen.png]
borune,
11.8.2014, 17:10 Получения сигнала во время выполнения цикла.
Вставь в цикл: QCoreApplication::processEvents()
Trisch,
8.8.2014, 7:09 Dragscroll QScrollArea внутри QGraphicsView
Amadey, используй тэг code при оформлении сообщений содержащих фрагменты исходных кодов
Amadey,
8.4.2014, 18:33 в чем сделать исталятор драйвера?
У Экселсиора простой установщик есть, попробуй им
mezmay,
8.4.2014, 18:27 Классы в динамических библиотеках.
Тут правильнее речь вести об объекте (экземпляре класса). В каком потоке ты его создаёшь, в том он и будет жить.
MishaUA,
5.4.2014, 18:22 Классы в динамических библиотеках.
class MyLib : public QObject
MishaUA, не вижу у тебя инициализации структуры w

А вообще сделай функцию, которая будет создавать экземпляр (объект), а дальше работай с ним как обычно.

class MyWidget : public QWidget
{
public:
    MyWidget (arg1, arg2, ...);

}

MyWidget* creatMyWidget(arg1, arg2, ...)
{
    return new MyWidget(arg1, arg2, ...)
}

    QLibrary    *lib = new QLibrary("d:/MyLib1.dll", this);
    qDebug() << lib->load();

    typedef QWidget* (*CreatMyWidget) ();
    CreatMyWidget    creatMyWidget = (CreatMyWidget)(lib->resolve("widget"));
    QWidget    *w = creatMyWidget();
    ...
MishaUA,
12.3.2014, 4:37 QMdiArea. Не понятное поведение
Цитата(MishaUA @ 11.3.2014, 1:35) *
 child->show();
к стати говоря, чтобы не было глюков, лучше манипуляции делать через экземпляр QMdiSubwindow, т.е.:

QMdiSubWindow *sub = ar->addSubWindow(child);
sub->show(); // командуем субокну, а не виджету

MishaUA,
19.2.2014, 20:21 Создание рабочего экзешника
По мотивам документации, написана статья в нашей Вики: Развертывание приложений Qt в MS Windows
borune,
8.2.2014, 13:36 Работа с подготовленными запросами (QSqlQuery::prepare) (Firebird 2.1), оптимизация запросов, кэширование, транзакции
Цитата(Steklova Olga @ 7.2.2014, 20:36) *
q.exec(squery);
    if (!q.isActive())
Если ты хочешь проверить успешность запроса, то смотри что возвращает exec(), а не активность/неактивность. Часто isActive() будет возвращать Ложь
Цитата(Steklova Olga @ 7.2.2014, 20:36) *
А если я выполняю несколько запросов, используя один QSqlQuery q, то мне каждый раз надо вызывать setForwardOnly?
Нет
Цитата(Steklova Olga @ 7.2.2014, 20:36) *
А если у меня в таблице, например, 15000 записей. Надо их почти все удалить. Значит надо делать так? И транзакция здесь тоже нужна?
Транзакции лучше применять всегда явно.

Но драйвер Qt для Firebird убогий, в нём нельзя задавать тип транзакции.
Steklova Olga,
8.2.2014, 13:05 Работа с подготовленными запросами (QSqlQuery::prepare) (Firebird 2.1), оптимизация запросов, кэширование, транзакции
Цитата(Steklova Olga @ 7.2.2014, 20:36) *
То есть так?
на мой вгляд это:
Цитата
if (!q.prepare(squery))
лишнее условие
Цитата(Steklova Olga @ 7.2.2014, 20:36) *
А почему это приводит к увеличению скорости?
потому что, когда ты не начинаешь транзакцию явно, то транзакция создаётся не явно, т.е. будет пачка транзакций вместо одной, на каждый "бинд". Это даже на SQLite очень хорошо заметно (для ~50 вставок скорость увеличивается в 2-3 раза)


Цитата(Steklova Olga @ 7.2.2014, 20:36) *
Это стоит сделать независимо из количества выполнений запроса (qntRec)?И при qntRec = 10, и при qntRec = 20000?
Я обычно оборачиваю в транзакцию, если циклов потенциально может быть больше 5.


Цитата(Steklova Olga @ 7.2.2014, 20:36) *
“При помещении в базу данных большого количества данных в пакете предпочтительным является разбиение их на группы и подтверждение работы приблизительно через каждые 5000-10000 строк.”
У Firebird-а есть точки сохранения (savepoints) и здесь они имеются ввиду. Просто для надёжности, а вдруг связь с сервером прервётся. Но их не поддерживает оригинальный драйвер Qt. На прог.орге человек выкладывал свой драйвер Firebird-а, вроде он их поддерживает.


Цитата(Steklova Olga @ 7.2.2014, 20:36) *
объявить запрос (и использовать это объявление для нескольких запросов),
Это всёго лишь экземпляр класса QSqlQuery, но не запрос с точки зрения СУБД.
Нужно лишь такое:
QSqlDatabase::database().transaction(); // Начали транзакцию
q.exec(squery); // выполнили запрос
QSqlDatabase::database().commit();// зафиксировали, или откатились
Для FB откатыватся при ошибках сильно рекомендую, иначе мертвые транзакции так и останутся в БД, т.к. FB хранит версии своих состояний.

Цитата(Steklova Olga @ 7.2.2014, 20:36) *
Недостаточно просто объявить запрос, подготовить его, проверить результат prepare, забиндить значения параметров запроса и выполнить его? Притом обрамив все это в транзакцию.
достаточно
Steklova Olga,
5.2.2014, 16:32 QTranslator не переводит
я не сталкивался с ситуацией, когда строки помечаются как строки для перевода, до установки переводчика. Возможно причина в этом, чтобы проверить попробуй переместить строку
QString aaa = QObject::tr(QT_TR_NOOP("Hello"));

после
QApplication::installTranslator(&translator);




И, кстати, У тебя масло масленное получилось, используй либо макрос, либо QObject::tr()
aerosun,
4.2.2014, 19:50 Работа с подготовленными запросами (QSqlQuery::prepare) (Firebird 2.1), оптимизация запросов, кэширование, транзакции
Цитата(Steklova Olga @ 4.2.2014, 21:11) *
Где бы про это почитать?
у Хелен Бори есть
Цитата(Steklova Olga @ 4.2.2014, 21:11) *
А я и не думала, что надо учитывать такие вещи, мне только хотелось оптимизировать работу, чтобы не загружать БД разборкой одинаковых запросов.
вот собственно и не думай, оптимизирует сама СУБД, обрати внимание на примеры Qt - QSqlQuery всегда локальная переменная.

Применительно к Firebird.
Из Qt в Qt-драйвер БД отправляется срока prepare и пачка (массив) аргументов, этот драйвер прям как есть всё отправляет в Firebird, т.е. строка prepare и массив аргументов.
Firebird по строке prepare строит план запроса и сохраняет его, затем используя массив аргументов сам "биндит" их в план.

В большинстве случаев можно полагать, что сделав с двух разных машин и программ один и тот же prepare Firebird постарается воспользоватся уже подготовленным (с предыдущего события) планом запроса.

Firebird кэширует план запроса, в прочем MySQL тоже должен так делать. Собственно времени больше всего уходит именно на построение плана запроса.

Цитата(Steklova Olga @ 4.2.2014, 21:11) *
Лучше будет для оптимизации вообще все эти запросы делать с prepare? Или есть случаи, когда лучше их выполнить сразу, без подготовки, как q.exec(sQuery) ?
prepare полезно делать в ситуации, когда ты собираешься несколько наборов данных одинаковым запросом отправлять.

П.С.
Обрамить всю пачку prepare-bind в транзакцию - существенно увеличить скорость выполнения этой пачки (для любой БД), а для Firebird-а ещё и меньше мусорить, т.к. он версии состояний хранит.

П.П.С.
Т.к. Firebird версионник, он работает сильно не так как MySql. Недействительным план запроса может стать в других ситуациях.





Цитата(Steklova Olga @ 4.2.2014, 21:11) *
В процессе работы кэш запросов хранит текст запроса SELECT вместе с соответствующим результатом, который посылался клиенту.
Вот в Firebird я не помню чтоб результат запроса сколь-нибудь долго кэшировался, для заданной версии, может быть, но версий множество по-этому в общем котле вряд ли. А вот план кэшируется всегда для любого типа запроса
Steklova Olga,
4.2.2014, 13:46 Побитовое чтение переменных и циклический сдвиг.
Цитата(gvenihvivar @ 4.2.2014, 10:42) *
имя_переменной.номер_бита
это обращение к члену битового поля (Си)

Глянь QBitArray
Цитата(gvenihvivar @ 4.2.2014, 10:42) *
Есть ли в Qt побитовый циклический сдвиг.
В Qt это не нужно, т.к. есть оператор сдвига в СИ
>>
и
<<
Выдвигаемый бит запоминаешь, потом его "в зад" добавляешь, компилятор это дело просекает и использует соответствующие ассемблерные инструкции.
gvenihvivar,
3.2.2014, 21:19 Работа с подготовленными запросами (QSqlQuery::prepare) (Firebird 2.1), оптимизация запросов, кэширование, транзакции
Да это не страшно, FireBird кэширует подготовленные запросы. (они именно в таком виде и улетают в БД из твоей программы)

Цитата(Steklova Olga @ 3.2.2014, 21:23) *
у меня перестала работать подготовка запроса. prepare стал выдавать ошибку Driver not loaded. Не понимаю, в чем дело.
по всей видимости это произошло потому, что QSqlQuery будучи членом класса создаётся тогда же когда создаётся экземпляр класса DBFunctions, а он в свою очередь создаётся до соединения с БД. Соответственно этот QSqlQuery пытается работать с недействительным соединением.

В обще его лучше оставить в покое (т.е пусть он будет локальным в функции), заодно и имя ему дать короткое - q.
Steklova Olga,
3.2.2014, 14:22 QListWidget: как отследить mouse leave от дочернего элемента?
Цитата(aerosun @ 29.1.2014, 18:51) *
2) Как словить mouse click вне елементов? (когда юзер кликает между элементами)
в представлении ловить или во viewport() представления.
aerosun,
19.1.2014, 7:18 operator QString() const
Нашёл!

Форма:
T::operator R();

Означает оператор приведения типа:
(R)
Для определенных пользователем преобразований возвращаемый тип задается неявно и совпадает с именем оператора.

Т.е.
QUuid::operator QString()
для
QString s;
QUuid q;
s = (QString)q;

а
QUuid::operator GUID()
для
GUID w;
QUuid q;
w = (GUID)q;
crot26rus,
14.1.2014, 12:25 Обработать событие выключение компьютера
В Qt есть поддержка POSIX-сигналов, но для Виндовоза видимо придётся писать своё с использованием WinAPI.
mezmay,

30 страниц V   1 2 3 > » 
RSS Текстовая версия Сейчас: 21.11.2017, 20:49