crossplatform.ru

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


Сейчас на сайте человек: 17
(пользователей: 0, гостей: 17)
Google.com, Yandex.com

Перейти к месяцу

Декабрь 2018

  ПВСЧПСВ
»
1
2
»
3
4
5
6
7
9
»
10
11
12
13
14
15
16
»
19
20
22
23
»
24
25
26
27
28
29
»
31

> Последние обсуждения
demon051 @ 7.12.2018, 13:06
Просмотров: 42   Комментариев: 1
 
> Как уменьшить количество подключений к серверу до одного?
Автор demon051 — 7.12.2018, 13:06 — 1 комментариев
Всем привет.

Вопрос в общем-то идиотский ) Все борются с тем, как увеличить, а мне надо наоборот

Есть написанный серверный код, который запускает листнер на порту и ждет подключения клиента

Код
.....
while(...)
{
if(select(FD_SETSIZE, &readset, NULL, NULL, &connection_timeout)==0)
continue;
//обработка подключения
.....
while(...)
{//обмен
....
}
.....
}
и далее после подключения уходит в цикл обмена с клиентом.

но если другой клиент попробует подключиться к этому же серверу, то он на своей стороне получит ОК.
однако, поскольку на сервере select не обработает это подключение, то клиент останется в подвешенном состоянии.

Вопрос: можно ли как-то указать, что если уже есть подключение, то все другие попытки получают отказ?

Понятно, что код можно переписать так, чтобы всё это фильтровать... Но он уже написан как есть и переделывать очень не хочется за "тем парнем". Надо "косячить" дальше :)
Просмотров: 42, последний комментарий от Iron Bug   

> QWebSocketServer - не эмитирует сигналы
Автор Алексей1153 — 4.12.2018, 14:00 — 2 комментариев
пытаюсь соорудить http сервер на основе QWebSocketServer и QWebSocket. Делаю по предложенному в справке примеру (ничего там сложного нет, в общем-то)

Просмотрщиком портов вижу, что слушалка поднимается, а когда устанавливаю соединение - established сокет тоже появляется

Но объект QWebSocketServer молчит на предмет сигналов, и даже "асинхронный" вызов hasPendingConnections и nextPendingConnection ничего полезного не возвращает. Что примечательно, сигнал close ловится

Делаю эксперимент: заменяю на том же месте на классы QTcpServer и QTcpSocket (потому что работа аналогичная). И вот все сигналы исправно ловятся.

Что не так с классом QWebSocketServer , какие-то хитрости нужно учесть ?

Или посоветуйте альтернативный вариант http сервера на C++. (можно, конечно, вручную всё пропарсить, но это как-то не очень правильно при наличии специального класса :) )
Просмотров: 50, последний комментарий от Алексей1153   

> Получается монстр
Автор Анна — 30.11.2018, 17:27 — 1 комментариев
Есть у меня огромная структура, которая представляет из себя внутренности некоторого устройства.
Изначально требовалось приложение, которое скачивает в эту структуру из устройства значения, что-то меняет, записывает обратно.
Потом появилась надобность в другом приложении, пользующемся этой же структурой, потом ещё одно приложение...

В результате у меня родился класс, который обслуживает эту структуру по принципу "мне нужно такое-то значение" - "на тебе это значение", и т.п. - то есть куча сигналов и слотов.

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

class Interface
{
...
   void setManager(Manager *m) {m_manager = m;};
   void foo1();
   void foo2()
...
   Manager *m_manager;
};

Interfase::foo1()
{
   m_manager->setValueA(val);
}

Interface::foo2()
{
   int val = m_manager->valueA();
}



у меня получились :

class Interface
{
...
   void foo1();
public slot:
   void foo2(int);

signal:
   void valueARequired(); // интерфейсу требуется значение A
   void valueAChanged(int); // интерфейс изменил значение A

...
};


void Intreface::foo1()
{
...
   emit valueAChanged(val);
}

Interface::foo2(int a)
{
   int val = a;
...
}


Ну, и, конечно же, есть в главном окне штабеля коннектов:

connect(interface, SIGNAL(valueAChanged(int)), manager, SLOT(setValueA(int))); 
connect(interface, SIGNAL(valueAChanged(int)), manager, SLOT(setValueA(int)));
connect(manager, SIGNAL(valueAChanged(int)), interface, SLOT(foo2(int)));
...


Классов типа Interface несколько (они абсолютно разные. Среди них есть и QWidget и QObject), каждому нужны различные значения из структуры, спрятанной в Manager, каждый хочет какие-то поля менять и получать уведомления об изменениях.
Мне вот интересно, это нормально нормальный подход к решению - всё решать через сигнал-слот, или нужно всё-таки делать гибрид, когда есть и обращение к менеджеру через указатель и с помощью сигналов, слотов и connect()? И, вообще, когда какое решение лучше применять? По ходу, получается паттерн Наблюдатель, но только оба класса являются взаимными Наблюдателями.

Просмотров: 33, последний комментарий от Алексей1153   

> Делегат QComboBox в модели QTableView
Автор Jafferson — 23.11.2018, 8:19 — 2 комментариев
Добрый день товарищи. Появилась проблема которую не могу решить уже очень долгое время. В общем, у меня есть модель QTableView в которой я хочу в определенном столбце выводить делегат QComboBox. Проблема в том, что не понимаю что нужно возвращать в методе data в столбце где должен быть делегат. Подскажите, что я делаю не так. P.S. Это мой первый большой проект на Qt, так что принимаю любую критику.

Описание делегата.
void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QStyledItemDelegate::paint(painter, option, index);
}

QWidget *MyDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{    
    if (index.column() == 2)
    {
        QComboBox *comboBox = new QComboBox(parent);
        comboBox->addItems(m_list);
        return comboBox;
    }
    else
    {
        return QStyledItemDelegate::createEditor(parent, option, index);
    }

}

void MyDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    if (index.column() == 2)
    {
        QComboBox *comboBox = static_cast<QComboBox*>(editor);
        int pos = comboBox->findText(index.model()->data(index, Qt::EditRole).toString(), Qt::MatchExactly);
        comboBox->setCurrentIndex(pos);
    }
    else
    {
        return QStyledItemDelegate::setEditorData(editor, index);
    }
}

void MyDelegate::setModelData( QWidget * editor, QAbstractItemModel *model, const QModelIndex& index) const
{
    if (index.column() == 2)
    {
        QComboBox *comboBox = static_cast<QComboBox*>(editor);
        QString data = comboBox->currentText();
        model->setData(index, data);
    }
    else
    {
        return QStyledItemDelegate::setModelData(editor, model, index);
    }
}

void MyDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &) const
{
    editor->setGeometry(option.rect);
}


Слот, который создает новую заметку в таблице.
bool MainWindow::addDiscip()
{
    if (!isTableOpen())
    {
        QMessageBox::warning(this, "Внимание", tr("Таблица не открыта!"));
        return false;
    }

    AddDiscipDialog discipDlg(this);
    discipDlg.setWindowTitle("Дисциплины");
    MyDelegate *delegate = new MyDelegate(this);
    Note note;  // объект который содержит в себе информацию: название, номер семестра, номер курса дисциплины
    discipDlg.setNote(&note);
    discipDlg.setDelegate(delegate);
    if (discipDlg.exec() != AddDiscipDialog::Accepted)
    {
        return false;
    }

    maintable->insert(note);
    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
    ui->tableView->setItemDelegateForColumn(2, delegate);
    return true;
}


Метод data моей модели.
QVariant MainTable::data(const QModelIndex &index, int role) const
{
    if (role == Qt::DisplayRole)
            switch (index.column())
            {
            case 0:
                return mMainTable[index.row()].discipname();
            case 1:
                return mMainTable[index.row()].discipcourse();
            case 2:
                return ???
            }

    return QVariant();
}
Просмотров: 57, последний комментарий от Litkevich Yuriy   

RSS Текстовая версия Сейчас: 12.12.2018, 4:30