Russian Qt Forum
Май 16, 2024, 11:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 3 4 [5] 6 7 ... 21
61  Qt / Пользовательский интерфейс (GUI) / Re: Одинаково покрасить кнопку в Qt4 и Qt5 : Февраль 12, 2015, 17:31
В общем порешалось с QApplication::setStyle(QStyleFactory::create("Windows")); для 2х версий Qt.
62  Qt / Пользовательский интерфейс (GUI) / Re: Одинаково покрасить кнопку в Qt4 и Qt5 : Февраль 11, 2015, 17:42
А без применения стилей покрасить как-то возможно используя QPalette?
63  Qt / Пользовательский интерфейс (GUI) / [РЕШЕНО] Одинаково покрасить кнопку в Qt4 и Qt5 : Февраль 11, 2015, 16:56
Доброго дня! Собственно как покрасить (одним кодом) кнопку (желательно через QPalette) в 2х версиях Qt. В 4ке красится, если установлен QApplication::setStyle( new QPlastiqueStyle ) приложению или другой стиль + setAutoFillBackground(true) кнопке. В 5 версии QPlastiqueStyle я не нашел, а такой код QApplication::setStyle(QStyleFactory::create("Plastique")); ничего не меняет!  Непонимающий
64  Qt / Работа с сетью / Re: Передать по сети большую структуру данных : Ноябрь 25, 2014, 13:58
DenKor29, спасибо за разъяснения. Но получилось доделать свой вариант таким образом:
Код:
while(sock.command->bytesAvailable())
    {
        // читаем заголовок команды
        headCommand headComm(-1);
        int rc = sock.command->read((char*) &headComm, sizeof(headCommand));
        if((rc == -1) || (rc == 0))
          return;

        // подождем полного пакета данных, если он пришел не полностью
        if(!waitRecvData(headComm.sizeData))
        {
           sock.command->readAll();
           return;
        }

        switch(headComm.type)
        {
              ...
        }
ф-ция ожидания прихода данных
Код:
bool Client::waitRecvData(int sizeData)
{
    // если доступных данных для чтения из сокета меньше, чем должно быть
    // подождем прихода данных 1 msec, но не более 5 msec
    int time = 0;
    while((sock.command->bytesAvailable() < sizeData) && (time < 5))
    {
       sock.command->waitForReadyRead(1); // msec
       time++;
    }
    if(time >= 5) return false;

    return true;
}
65  Qt / Работа с сетью / Re: Передать по сети большую структуру данных : Ноябрь 24, 2014, 23:09
Соответсвенно работа идет через буфер ввода-вывода.

1. Считываете заголовок с фиксированным размером (размер буфера больше длины заголовка).
2. Выясняете размер передаваемых данных и считываете в буфер оставшиеся данные
В текущей ситуацией с размером памяти можно считывать напрямую в QByteArray.


Имхо прежде чем все реализовать продумайте логику комманд протокола.
Как-то не совсем понятно..
Через буфер ввода-вывода - это QDataStream?! Как-то с ним мало работал.. Всегда было проще фиксированную структуру записать в сокет, затем ее же и вычитать.. в чем преимущество в данном случае QDataStream, он не будет бить данные и все считает за раз?
66  Qt / Работа с сетью / [РЕШЕНО] Передать по сети большую структуру данных : Ноябрь 24, 2014, 22:22
Есть некий список структур, который нужно передать с сервера на клиент, либо с клиента на сервер.
Сериализую список в QByteArray следующим образом: сначала добавляю заголовок в котором указываю, количество объектов в списке и размер передаваемых данных.

Код:
   QByteArray arrBlockHead,arrBlockBody,arrBlockSend;
   headCommand headComm(cmdTypeSign);

    for(int i = 0; i < gui->lstSign.size(); ++i)
    {
        arrBlockBody.append((const char*)(&gui->lstSign[i].prmSign),sizeof(PrmSign));
        arrBlockBody.append((const char*)(&gui->lstSign[i].base),     sizeof(BaseParamObj));
        for(int p = 0; p < gui->lstSign[i].prmSign.countPoint; ++p)
        {
            _doubleValue _x,_y;
            _x.value = gui->lstSign[i].posInGeo[p].x();
            _y.value = gui->lstSign[i].posInGeo[p].y();
            arrBlockBody.append((const char*)(&_x),sizeof(_doubleValue));
            arrBlockBody.append((const char*)(&_y),sizeof(_doubleValue));
        }
    }

    headComm.numberData = gui->lstSign.size();
    headComm.sizeData   = arrBlockBody.size();
    arrBlockHead.append((const char*)(&headComm),sizeof(headCommand));

    arrBlockSend.append(arrBlockHead);
    arrBlockSend.append(arrBlockBody);
arrBlockSend - пишу в сокет.

на принимающей стороне сначала вычитываю заголовок:
Код:
headCommand headComm(-1);
int rc = sock.command->read((char*) &headComm, sizeof(headCommand));

оттуда забираю тип присланных данных, размер sizeData и количество numbData и отдаю нужной функции на обработку:
Код:
void Client::procPacketSign(int sizeData, int numbData)
{    
    if(sock.command->bytesAvailable() >= sizeData)
    {
        QList<AllPrmSign> recvListSign;
        for(int i = 0; i < numbData; i++)
        {
            AllPrmSign allSign;
            qint64 rc_p0 = sock.command->read(reinterpret_cast<char*>(&allSign.prmSign),sizeof(PrmSign));
            qint64 rc_p1 = sock.command->read(reinterpret_cast<char*>(&allSign.base),sizeof(BaseParamObj));
            if((rc_p0 == sizeof(PrmSign)) && (rc_p1 == sizeof(BaseParamObj)))
            {
                for(int p = 0; p < allSign.prmSign.countPoint; ++p)
                {
                    _doubleValue _x,_y;
                    qint64 rc_p2 = sock.command->read(reinterpret_cast<char*>(&_x),sizeof(_doubleValue));
                    qint64 rc_p3 = sock.command->read(reinterpret_cast<char*>(&_y),sizeof(_doubleValue));
                    if((rc_p2 == sizeof(_doubleValue)) && (rc_p3 == sizeof(_doubleValue)))
                    {
                        QPointF posMet;
                        posMet.setX(_x.value);
                        posMet.setY(_y.value);
                        allSign.posInGeo.push_back(posMet);
                    }
                }
                recvListSign.push_back(allSign);
            }
        }

        network->aws->gui->lstSign.clear();
        network->aws->gui->lstSign = recvListSign;

        network->aws->winDraw->recalcCoordGeoToPixSign();
        emit sgRecvNewSign();
    }
}

Все вроде как работает до размера передаваемого списка ~2Kb, если передаваемых данных становится больше, то посылка начинает дробиться на меньшие части, в одной из которых будет заголовок с нужной инфой, во второй части естественно нет. Поэтому происходит неправильное чтение из сокета, ну и дальнейшая каша. Вопрос: как правильно реализовать такого рода обмен? Самому дробить на части, но как это правильно сделать и гарантирует ли TCP\IP ту последовательность прихода данных с которой они были записаны в сокет?
67  Компиляторы и платформы / Linux / Re: Программно выключить компьютер под пользователем в Linux : Ноябрь 20, 2014, 14:36
Давно не смотрел эту ветку, а тема, как оказывается, была активно просматриваемая. Ответ тогда нашелся через QDBus, может кому пригодится!

Код:
.pro
CONFIG += qdbus
...
#include <QtDBus/QtDBus>

QDBusInterface iface("org.freedesktop.ConsoleKit",
                             "/org/freedesktop/ConsoleKit/Manager",
                             "org.freedesktop.ConsoleKit.Manager",
                             QDBusConnection::systemBus());

            if(iface.isValid())
            {
                QDBusReply<QString> reply = iface.call("Stop");
                if(reply.isValid()) {
                    printf("Reply was: %s\n", qPrintable(reply.value()));
                }

                fprintf(stderr, "Call failed: %s\n", qPrintable(reply.error().message()));
            }
            else
            {
                qDebug() << "QDBusInterface not valid";
            }
68  Qt / Model-View (MV) / Re: программно выделить несколько строк в QTableView : Ноябрь 12, 2014, 19:47
А ссылочка отличная, удобно читать исходники. Спасибо gil9red!!!
69  Qt / Model-View (MV) / Re: программно выделить несколько строк в QTableView : Ноябрь 12, 2014, 19:41
Тогда, вручную указывайте, например, с помощью void QItemSelectionModel::select ( const QModelIndex & index, QItemSelectionModel::SelectionFlags command )

а это не будет тоже самое, что выделять selectRow(int row) у QTableView? т.е. получается все равно нужно пробегаться и по ОДНОЙ строчке выделять..

Сами посмотрите и сравните: http://code.woboq.org/qt5/qtbase/src/widgets/itemviews/qtableview.cpp.html#_ZN17QTableViewPrivate9selectRowEib  Улыбающийся Подмигивающий

мда..попробовал. получилось чуть меньше, но это только из-за того, что выделился только первый столбец, а нужно выделять строку.. (там больше одного столбца), т.е. выделять все индексы строки и в итоге получится тоже самое, если даже не медленнее. засада  Непонимающий есть еще какие варианты?
70  Qt / Model-View (MV) / Re: программно выделить несколько строк в QTableView : Ноябрь 12, 2014, 19:21
Тогда, вручную указывайте, например, с помощью void QItemSelectionModel::select ( const QModelIndex & index, QItemSelectionModel::SelectionFlags command )

а это не будет тоже самое, что выделять selectRow(int row) у QTableView? т.е. получается все равно нужно пробегаться и по ОДНОЙ строчке выделять..
71  Qt / Model-View (MV) / Re: программно выделить несколько строк в QTableView : Ноябрь 12, 2014, 19:04
Смотри в сторону QTableView::selectionModel ().

у меня есть QItemSelectionModel selectModel, есть места где она мне возвращает список выделенных строк (индексы)
QModelIndexList indexes = selectModel->selectedRows(); но как с ее помощью выделить несколько строк я не нашел.

selectionModel нужна не только чтобы получить список выделенных строк Улыбающийся
у selectionModel есть метод select, который принимает ссылку на QItemSelection, а тот позволяет указать область выделения с помощью своего метода select Улыбающийся

хорошо.. получается последний select принимает на вход верхний левый индекс выделения и правый нижний, т.е. все индексы в этой области, правильно я понимаю? а если по условиям выделения мне нужно выделить скажем 1,3,10,41,42,43,70,71.. строки, не сплошной массив строк, тогда как?
72  Qt / Model-View (MV) / Re: программно выделить несколько строк в QTableView : Ноябрь 12, 2014, 16:56
Цитировать
программно выделить несколько строк в QTableView
и
Цитировать
при наличии больше 200-300 строк процесс очень тормозится

не особо стыкуются... Улыбающийся


попробуй

void QTableView::setSelection ( const QRect & rect, QItemSelectionModel::SelectionFlags flags ) [virtual protected]

Но тут придется вычислить QRect для выделения.

да, имелось ввиду несколько десятков строк) а как правильно будет рассчитать эту область?
73  Qt / Model-View (MV) / Re: программно выделить несколько строк в QTableView : Ноябрь 12, 2014, 16:37
Смотри в сторону QTableView::selectionModel ().

у меня есть QItemSelectionModel selectModel, есть места где она мне возвращает список выделенных строк (индексы)
QModelIndexList indexes = selectModel->selectedRows(); но как с ее помощью выделить несколько строк я не нашел.
74  Qt / Model-View (MV) / программно выделить несколько строк в QTableView : Ноябрь 12, 2014, 16:29
Доброго дня! если выделять selectRow(index) каждую строчку, то при наличии больше 200-300 строк процесс очень тормозится. как это можно сделать за один раз? selectAll(); делает выделение быстро, но мне нужно выделять не все, а только выбранные строки.
75  Qt / Пользовательский интерфейс (GUI) / Re: Отжать кнопку QToolButton : Октябрь 02, 2014, 09:48
Пока видится самое простое решение - это самому создать QMenu и добавить в него actQFreq.
Меню через setMenu() установить на кнопку btnQuickFreq.
Прятать меню через btnQuickFreq->menu()->hide().

КУЛ! Улыбающийся Работает) Всем спасибо за участие)
Страниц: 1 ... 3 4 [5] 6 7 ... 21

Страница сгенерирована за 0.058 секунд. Запросов: 20.