crossplatform.ru

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

История благодарностей участнику PAFOS ::: Спасибо сказали: 29 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
23.8.2012, 16:46 [Решено] UDP сервер для многих клиентов?
TCP буферизует данные

да, это так если, но если отключить алгоритм Нагла (Nagle algorithm). То данные будут отправлять сразу же )

предугадывая вопрос "Как это сделать?" отвечаю:

int on = 1;
setsockopt( qtcpSocket->socketDescriptor(), IPPROTO_TCP, TCP_NODELAY, &on, sizeof( on ) );



Имей ввиду, что UDP не гарантирует 100% доставку пакета + его правильность.
т.е. если клиент послал 1,2,3
то к серверу может придти 2,1,3
а может придти только 2,1 или вообще только 3)
Norrius,
23.8.2012, 16:27 Перевод ancii в hex
QByteArray pass = QTextCodec::codecForName("Windows-1251").makeEncoder().fromUnicode(password);
RazrFalcon,
23.8.2012, 16:22 Передача массива из Qt программы в Free Pascal библиотеку
хм....

procedure Sort(A: PDoubleArray); stdcall;
- говорит что у тя процедура, т.е. она в понимании С/С++ возвращает void.
typedef double (*Sort)(double [Size]);
- говорит, что у тебя фунция, которая должна возвращать тип double

подозреваю, что из-за этого у тебя портится стек и каша получается...
попробуй
typedef void (*Sort)(double [Size]);

вместо
typedef double (*Sort)(double [Size]);


==========================
чет тупанул )

typedef double (*Sort)(double [Size]);


это че, получается double теперь у тебя есть указатель на функцию?
rominf,
21.5.2012, 12:36 Прокрутка на значке в трее
Как вариант - наследование QCoreApplication и переопределение bool QCoreApplication::event ( QEvent * e ),
где ловить QEvent::WheelEvent, и если координаты мыши входят в QSystemTrayIcon::geometry(), перенаправлять соответствующему объекту событие. Вот как бы я сделал:

class MyTrayIcon : public QSystemTrayIcon{

public:
   virtual void whellEvent( QWhellEvent *ev )
   {
       // processing
   }
  

};

class MyApplication : public QApplication{

  private:
      MyTrayIcon *m_icon;

  protected:
     bool event(QEvent * e){
         if( m_icon &&
             e->type() == QEvent::WheelEvent &&
             m_icon->geometry().contains( ((QWheelEvent*)e)->globalPos() )
            )
         {
              m_icon->wheelEvent( (QWheelEvent*)e );
              return true;
         }
         return false;        
     }

  
  public:
    MyApplication( int argc, char **argv ):QApplication(argc,argv),m_icon(0){}

    void setSystemTrayIcon( MyTrayIcon *instance ){
         m_icon = instance;
     }
    
    MyTrayIcon* systemTrayIcon() const {
         return m_icon;
    }

};
efg,
13.3.2012, 7:52 Использование QtScript
ну да, все правильно))

functionArguments["AddScore"] = FuncInfo(1,Func_AddScore);


вот так надо)
faustin,
12.3.2012, 8:56 Использование QtScript
Если не смущает описать врапер на каждую функцию, то могу предложить такой вариант:

enum FuncName
{
   Func_AddScore, ....
};

struct FuncInfo
{
  
   int ArgumentsCount;
   FuncName Name;

   FuncInfo( int a, FuncName n ):ArgumentsCount(a),Name(n){}
};

QHash<QString,int> functionArguments;
functionArguments["AddScore", FuncInfo(1,Func_AddScore)];
...
...

QScriptValue NativesCaller(QScriptContext* c, QScriptEngine *engine)
{
   // Первый аргумент - имя вызываемой функции
   QString funcName = context->argument(0).toString();

   if( !functionArguments.contains(funcName) )
   {
         // Если не найдена вызываемая функция, бросаем исключение
         return c->throwError( QString("No such function %0").arg(funcName) );
   }

   FuncInfo inf = functionArguments[funcName];
   if( inf.ArgumentsCount != c->argumentsCount()-1 )
   {
        // Если не совпадает кол-во аргументов для функции, бросаем исключение
        return c->throwError( "arguments count mismatch" );
   }

   QScriptValue retVal;
   switch( inf.FuncName )
   {
   case Func_AddScore:
        {
            int score = c->argument(1).toNumber();
            Player playerIndex = Natives::ConvertIntToPlayerIndex(Natives::GetPlayerId());
            Natives::AddScore(playerIndex, 1000);
            break;
        }
   }

   return retVal;
}

....
// Регистрация функции в скриптах
// myEngine имеет тип QStringEngine
QScriptValue fun = myEngine.newObject(NativesCaller);
myEngine.globalObject().setProperty("NativesCaller",fun);


// Работа с функцией в скрипте
try
{
   NativesCaller( "AddScore", 1000 );
}
catch( e )
{
  alert( e.description );
}
faustin,
17.11.2011, 14:46 построение таблицы
Где-то в вики была статья про то как использовать Excel в Qt. Ищи)
ArhiZhek,
17.11.2011, 13:56 QThead и subthread.
Скорее пойдет QAtomicInt. При старте каждый поток инкрементирует QAtomicInt, а при завершении декрементирует. если после декремента значение переменной == 0, тогда этот поток завершился последним.

class ThreadD : public QThread
{
  void run();
};

void ThreadD::run()
{
// что-нить делаем
}

class ThreadC : public QThread
{
  void run();

public:
   QAtomicInt *atomic;
}

void ThreadC::run()
{
    atomic->ref();
    // что-нить делаем
    
    bool isLast = atomic->deref();
    if( !isLast )
    {
         qDebug() << this->thread() << " i'am last finished";

         ThreadD *thd = new ThreadD();
         thd->start();
    }
}

class ThreadB : public QThread
{
  void run();

public:
   QAtomicInt *atomic;
}

void ThreadB::run()
{
    atomic->ref();
    // что-нить делаем
    
    bool isLast = atomic->deref();
    if( !isLast )
    {
         qDebug() << this->thread() << " i'am last finished";

         ThreadD *thd = new ThreadD();
         thd->start();
    }
}




class ThreadA : public QThread
{
    void run();
}

void ThreadA::run()
{
   QAtomicInt atomic;

   ThreadC *thC = new ThreadC
   thC->atomic = &atomic;
   thC->start();

   ThreadB *thB = new ThreadB
   thB->atomic = &atomic;
   thB->start();
}


Как-то так)
smartchecker,
17.10.2011, 16:43 Как сделать доступными МЕТОДы классов Qt?
Боюсь напрямую никак. только писать класс-обертку
faustin, skruk,
14.10.2011, 8:12 Как QDeclarativeView читает файлы!
Придумал костыль :)

У QDeclarativeEngine имеется свой QDeclarativeNetworkAccessManagerFactory c методом QNetworkAccessManager *create ( QObject * parent ) = 0.

нам нужно:

1. переопределить QNetworkAccessManager, который будет брать из zip архива данные
2. переопределить QDeclarativeNetworkAccessManagerFactory, который будет возвращать переопределенный QNetworkAccessManager
3. в setSource нашего declarative view устанавливаем какой-нибудь QUrl("zip://blablabla")

Пробуй!)

P.S. я не пробовал :)
Strikevld,
19.8.2011, 7:56 QList и indexOf
Все просто. У тебя QList<USBID*> хранит указатель на объект и, следовательно, при поиске сравниваются указатели на адреса, а не сами объекты.

Вижу два варианта:

1. Делаешь функцию которая принимает QList<USBID*> и то, что нужно найти. В цикле для каждого элемента, пока не будет найден искомый делаешь то, что сделал в операторе сравнения.

2. Используешь вместо QList<USBID*>, QList<USBID>
Surendil,
5.8.2011, 15:12 Не выделяется текст мышью в QTextEdit
Цитата
void TextEdit::mouseMoveEvent(QMouseEvent *e)
{
// if(mw->windowState() == Qt::WindowFullScreen)
// {
// if(!e->y()) emit showMenu();
// else emit hideMenu();
// }
}


у тебя mouseMoveEvent перекрывается производным классом и до QTextEdit не доходит вообще. В этом и кроется беда.

Решение:

Цитата
void TextEdit::mouseMoveEvent(QMouseEvent *e)
{
QTextEdit::mouseMoveEvent(e);
// if(mw->windowState() == Qt::WindowFullScreen)
// {
// if(!e->y()) emit showMenu();
// else emit hideMenu();
// }
}

или

Цитата
void TextEdit::mouseMoveEvent(QMouseEvent *e)
{
// if(mw->windowState() == Qt::WindowFullScreen)
// {
// if(!e->y()) emit showMenu();
// else emit hideMenu();
// }
QTextEdit::mouseMoveEvent(e);
}


Выбирай сам :)
QMainWindow,
2.8.2011, 14:11 Как правильно получать вывод программы запущенной во втором потоке?
Попробуй так

void OutWindow::readOut()
{
   QProcess* process = static_cast<QProcess*>(sender());
   ...
}
RazrFalcon,
2.8.2011, 13:17 Несколько окон последовательно
Для того чтобы виджет сразу удалился после метода close() необходимо дать ему атрибут Qt::WA_DeleteOnClose.
RazrFalcon,
10.5.2011, 16:41 Qt::DecorationRole и УТЕЧКА ПАМЯТИ
Я кажется нашел в чем косяк.

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

Решение:

я перенес создание pixmap в MyItem, вот что получилось:

myitem.h
Раскрывающийся текст
class MyItem
{
    MyItem *m_parent;
    QList<MyItem*> m_children;
    QVariant m_value;
    QString  m_name;
    QPixmap m_pixmap; // <==== теперь на один экземпляр MyItem будет один экземпляр QPixmap

public:
    MyItem();
    ~MyItem();

    MyItem *parent() const;
    int index() const;
    MyItem *child(int index) const;
    bool addChild(MyItem *item);
    int childrenCount() const;

    QPixmap pixmap() const; //  <==== вот тут поставил метод доступа
    QVariant value() const;
    void setValue(const QVariant &value);
    QString name() const;
    void setName(const QString &name);
};


myitem.cpp
Раскрывающийся текст
....

void MyItem::setValue(const QVariant &value)
{
    m_value = value;

    QColor color = value.value<QColor>();
    m_pixmap = QPixmap(16, 16);
    m_pixmap.fill(color);
}

QPixmap MyItem::pixmap() const
{
    return m_pixmap;
}

....


mymodel.cpp

Раскрывающийся текст
    case Qt::DecorationRole:
        {
            return pItem->pixmap();
        }

Iron Lappu,
5.5.2011, 16:37 Свойства QComboBox-мембера в дизайнере
посмотри пример QTDIR\examples\designer\containerextension.
очень много полезностей можно высмотреть.
Алексей1153,
27.4.2011, 8:24 Почитать количество ROW в QSqlQuery
Цитата(fortero @ 26.4.2011, 23:15) *
Просто мне внчале надо получить данные о количестве строк для передачи в мою функцию, а лиш потом получать контейнер query...


С точки зрения оптимальности я бы выполнил запрос данных, затем эти данные поместил в контейнер (например в QList) попутно обрабатывая данные. В итоге имеем
1. через QList::count() я могу получить кол-во записей, причем независимо от возможностей sql драйвера
2. данные уже преобразованы и готовы к дальнейшей обработке.

Все лучше чем делать два sql запроса)
fortero,
27.4.2011, 8:11 Как отправить Http-запрос с XML данными?
Все просто:

QByteArray body = "<xml version..."; // Содержание запроса

QNetworkRequest request;
request.setUrl(...);
request.setHeader(QNetworkRequest::ContentLengthHeader,body.count()); // Заголовок Content-Length
request.setRawHeader("X-EBAY-API-COMPATIBILITY-LEVEL", version );
request.setRawHeader("X-EBAY-API-DEV-NAME", devId );
// etc.

QNetworkReply *reply = networkManager.post(request,body); // Отсюда начинается посылка запроса (networkManager имеет тип QNetworkAccessManager)

connect(reply,SIGNAL(finished()),....); // Чтобы узнать о том, когда запрос завершится (причем успешно или нет), соединяемся с сигналом


Так же у класса QNetworkAccessManager есть перегруженный метод post ( const QNetworkRequest & request, QIODevice * data ) (подробности в доках),
который может напрямую послать в качестве тела HTTP запроса, например, данные из файла
sindbad07,
7.4.2011, 8:27 QSqlTableModel Выборка полей
Ну почему же выбирать)

QSqlTableModel наследуется от QSqlQueryModel, в которой есть метод setQuery().
Однако в QSqlTableModel он является защиненным (мне лично непонятно как :unsure: )

Есть хитрость:
Воспользуемся преимуществами наследования.

QSqlTableModel *tableModel = new QSqlTableModel();
QSqlQueryModel *queryModel = dynamic_cast<QSqlQueryModel*>(tableModel);
queryModel->setQuery( .... );


И вуаля! Все сработало)
abc,
6.4.2011, 9:03 Свойства QComboBox-мембера в дизайнере
Когда дизайнер вызывает QString QDesignerCustomWidgetInterface::domXml () const для твоего виджета, ты должен вернуть xml, описывающий виджет.
В этом методе ты как-то должен вызвать domXml для комбо бокса, он вернет свой xml описатель и ты вставишь его в свой.
Сделал на дизайнере форму и комбо бокс с тремя итемами.
Вот что выдал дизайнер:

Раскрывающийся текст
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <widget class="QComboBox" name="comboBox">
   <property name="geometry">
    <rect>
     <x>80</x>
     <y>90</y>
     <width>251</width>
     <height>22</height>
    </rect>
   </property>
   <item>
    <property name="text">
     <string>New Item</string>
    </property>
   </item>
   <item>
    <property name="text">
     <string>New Item</string>
    </property>
   </item>
   <item>
    <property name="text">
     <string>New Item</string>
    </property>
   </item>
   <item>
    <property name="text">
     <string>New Item</string>
    </property>
   </item>
  </widget>
</widget>
<resources/>
<connections/>
</ui>
Алексей1153,
4.4.2011, 8:42 Свойства QComboBox-мембера в дизайнере
Сорри за долгое молчание )

У дезигнера есть интерфейс QDesignerTaskMenuExtension, который позволяет добавлять свои пункты в это самое меню)
=> у комбо бокса этот интерфейс реализован.

Тебе необходимо у своего виджета реализовать этот интерфейс и проверять, если менюшка вызывается над комбо боксом, то вернуть ему плагин, который и добавляет пунк меню в виджет.

Но это тока идеи) сам я этим не занимался :unsure:

Или же внутри своего плагина, создавать плагин комбо бокса и добавлять в своим actions, actions комбо бокса
Алексей1153,
28.3.2011, 9:30 QTreeView или QTreeWidget
Набросал тут за часок... пока без коментов, кто захочет, разберется.
в исходниках валяется БД streets.sqlite, ее рядом с ехе положить следует.
silver47,
25.1.2011, 16:28 QLabel problem
Когда виджет находится внутри лайаута, за именение размеров виджета отвечает лейаут.

У каждого виджета есть метод sizeHint() который вызывается преимущественно лейаутом и возвращает "идеальные" размеры виджета.

Наверное когда ты устанавливаешь в лейбл пиксмап, то лейбл меняет свой "идеальный" размер под размер пиксмапа + 2-3 пикселя паддинга.
wiz29,
30.12.2010, 15:52 Как понять что программа работает в двух потоках?
Вклинюсь в дискуссию)

В свое время много-много убил времени на понимание потоков и как Qt с ними обращается))

Для достижения максимальной производительности необходимо создавать столько потоков, сколько физически одновременно может обработать проц.
Для двухядерников идеальным будет два потока, для четырех - четыре.

Еще момент, на создание самого потока у системы уходит уйма времени, поэтому не стоит убивать поток сразу после того как он обработал кадр.
После обработки кадра, поток должен ждать , когда ему сунут новый кадр для обработки.
При таком ожидании лучше всего использовать условные переменные. Условные переменные - разновидность объекта для синхронизации потоков.

Вот код, отображающий все вышеперечисленные моменты)
в коде я предполагаю, что есть класс Frame, который инкапсулирует такую сущность как кадр с камеры.
класс Frame имеет член - int number, который указывает его порядковый номер )

// Класс, который будет обрабатывать кадр в отдельном потоке
class Thread : public QThread
{
    private:
        void run();


    public:
        Frame mFrame;    // Кадр, который будет обрабатывать поток
                // после обрабтки кадра, переменная mFrame должна содержать измененный кадр

        QWainCondition mCondition;
            

    signals:
        // Сигнал испускается потоком, когда тот завершит обработку кадра
        void processingFinished();

    
}


void Thread::run()
{
    QMutex mutex;
    
    for(;;)
    {
        // Здесть мы ожидаем, когда контролирующий поток даст "добро" на обработку кадра
        // предполагается, что перед тем как потоку дадут "добро", переменная mFrame будет содержать кадр, который необходимо обработать
        mutex.lock();
        mCondition.wait(&mutex);
        
        // Код обработки помещаем тут

        // Обработку завершили, высылаем сигнал
        emit processingFiniched();

        mutex.unlock();
    }

    return;
}

// Класс. который распределяет кадры между потоками
class Constructor : public QObject
{
    Q_OBJECT

public:
    // Массив обработанных кадров, в правильном порядке
    QList<Frame> mFrames;


    public slots:
        // Слот, который будет вызываться при завершении одним из потоков обработки кадра
        void on_processingFinished( );
}

// Этот слот будет выполняться в основном потоке программы
void Constructor::on_processingFinished( )
{
    // Так мы определяем какой экземпляр класса завершил обработку
    Thread *t = dynamic_cast<Thread*>( sender() );

    // Получаем обработанный кадр
    Frame frm = t->mFrame;

    // Записываем его в массив, в нужное место
    mFrames[ frm.number() ] = frm;

    // Задаем потоку кадр, который он должен обработать
    t->mFrame = get_next_frame();

    // Даем "добро" на обработку кадра
    t->mCondition.wakeOne();
}



int main( int argc, char **argv )
{
    QCoreApplication a(argc,argv);

    Constructor c;

    // Резервируем место в массиве под все кадры
    c.mFrames.reserve( frames_count );

    // Так определяем кол-во потоков, которое РЕАЛЬНО ПАРАЛЛЕЛЬНО могут выполняться в системе
    int ideal_threads = QThread::idealThreadCount();

    // Создаем и запускаем потоки
        for( int i = 0; i < ideal_threads; i++ )
    {
        Thread *t = new Thread;
        // Соединяем сигнал потока о завершении обработки со слотом рапределителя кадром
        connect( t, SIGNAL(processingFinished()), &c, SLOT(on_processingFinished() );
        
        // Запускаем поток
        t->start();

        
        // Задаем кадр, который необходимо обработать потоку
        t->mFrame = get_next_frame();

        // Даем добро на обработку кадра
        t->mCondition.wakeOne();
    }
    

    return a.exec();
}


Вероятно многое может показаться непонятным, но я постараюсь ответить на них )
RazrFalcon,
28.12.2010, 14:24 Как работать с сертификатми?
Цитата
при заходе на этот же сайт еще раз (не выходя из программы), снова вываливался в слот sslErrors с теми же ошибками касаемо сертификатов, что и в первый раз.... Или стоп... так и должно быть? При reload-e какбы новый handshake у сокетов происходит?


Да, конечно - создается новые подключение же ))


Цитата
А можно как-то сделать чтобы вот принял я этот (пускай невалидный) сертификат, и больше для этого сайта в слот sslErrors не попадаю... Или так никак не сделать?)


Вроде можно. Поиграйся с QSslConfiguration - там можно тонко настроить поведение QNetworkReply с ssl.

Цитата
А в случае, если у хоста все нормально (например, https://google.com) с сертификатами (т.е. я не попадаю в слот ошибок ssl), как эти сертификаты тогда можно достать?


После того как QNetworkReply установит соединение его sslConfiguration изменится. Оттуда можно получить peerCertificate().

Цитата
И такой вопрос.... Qt (через механизмы openSSL) сам (на "низком" - не пользовательском уровне) при https-запросе отправляет информацию о сертификате хоста в центры CA? Т.е. вот этот механизм меня, как конечного пользователя Qt, не должен интересовать вообще, так?


Насчет этого я точно не знаю( Тоже интересно было бы узнать этот момент.

Цитата
И, наверное, последний вопрос... Почему именно QSslError::HostNameMismatch? Почему не CertificateExpired или не CertificateUntrusted? Можно где-то подробнее об этих ошибках почитать? А то в Qt Assistant только идентификаторы указаны этих ошибок и больше ничего на найти.... и не нагуглить(


Про HostNameMismatc это я из личного опыта взял).

CertificateExpired - у каждого сертификата же есть срок годности) эта ошибка видать вываливается когда он уже истек.
CertificateUntrusted - ненадежный сертификат. Я так подозреваю, что это ошибка вывалится, когда в sslConfiguration не нашлось такого сертификата, хотя он и подписан доверенным лицом. Этот момент надо проверить )


В любом случае отпишись как че узнаешь, меня эта тема тоже интересует)
Rocky,

2 страниц V   1 2 >
RSS Текстовая версия Сейчас: 22.10.2019, 7:07