Просмотр сообщений
|
Страниц: 1 ... 3 4 [5] 6 7 ... 21
|
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"; }
|
|
|
69
|
Qt / Model-View (MV) / Re: программно выделить несколько строк в QTableView
|
: Ноябрь 12, 2014, 19:41
|
мда..попробовал. получилось чуть меньше, но это только из-за того, что выделился только первый столбец, а нужно выделять строку.. (там больше одного столбца), т.е. выделять все индексы строки и в итоге получится тоже самое, если даже не медленнее. засада есть еще какие варианты?
|
|
|
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().
КУЛ! Работает) Всем спасибо за участие)
|
|
|
|
|