crossplatform.ru

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

История благодарностей участнику zloiia ::: Спасибо сказали: 5 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
31.5.2012, 4:09 Одновременное нажатие кнопок. Не modifiers
Цитата(vankleef @ 30.5.2012, 21:22) *
Всем доброго времени суток!

Как отловить нажатие нескольких кнопок, не комбинации с шифтом/контролом и т.д., а, например, нажатие стрелок вверх и влево.

Заранее благодарю!


Вариант с переопределением keyPressEvent и keyReleaseEvent и записью состояний нужных клавиш не подходит?
vankleef,
12.3.2012, 23:31 Подключение к базе данных на виртуальной машине (QODBC)
Цитата(Turbo @ 12.3.2012, 21:17) *
Всем доброго времени суток!
Пытаюсь подключиться к базе данных на виртуальной машине таким образом


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <C:\QtSDK\Desktop\Qt\4.8.0\mingw\include\QtSql\qsqldatabase.h>
#include "QSqlError"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::on_pushButton_clicked(){
db=QSqlDatabase::addDatabase("QODBC");
db.setHostName(ui->lineEdit->text());
db.setDatabaseName(ui->lineEdit_2->text());
db.setUserName(ui->lineEdit_3->text());
db.setPassword(ui->lineEdit_4->text());
db.setPort(1433);
db.setConnectOptions("SQL_ATTR_ACCESS_MODE=SQL_MODE_READ_ONLY;SQL_ATTR_TRACE=SQL_OPT_TRACE_ON");
if(!db.open()){
qDebug() << "Can't open DB: " << db.lastError().text();
}
else {
ui->lineEdit_5->setText("Good");
}
db.close();
}

Выдается ошибка:
Can't open DB: "[Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию QODBC3: Unable to connect"

Что я делаю не так?


Ну то что с ходу бросилось в глаза это то что для ODBC не указан драйвер коннектора. Я тоже бился головой о проблему невозможности подключиться просто по DNS имени источника данных. Приходилось все-же указывать имя коннектора. Вот можно почитать про синтаксис строки настроек ODBC http://msdn.microsoft.com/ru-ru/library/sy...tionstring.aspx http://www.connectionstrings.com/mysql

Хотя вот мне коллеги еще посоветовали посмотреть на такое http://www.easysoft.com/developer/libraries/qt/example.cpp
Turbo,
22.1.2012, 13:55 QT&ZigBee
Stoptyssin, а примеры... Может поможет. Кусок из моего давнего проекта. У нас было самопальное устройство, у которого сообщения с устройства были просты как валенки
Цитата
<CommandValue>

Где Command и Value были целыми числами. Данные капали где-то 5 раз в секунду и лень было заморачиваться с оптимизацией, поэтому сделал так. (писал с использованием QextSerialPort но разницы никакой). Унаследовался от QextSerialPort , завел слот, который связал с сигналом readyRead() (то есть в этом слоте читал данные, которые пришли с порта). В нем все что приходило забивал в свойство этого класса типа QByteArray (то есть создавал буфер на случай если у меня не вся команда придет сразу) и затем в этом буфере искал целую команду. Когда находил команду, высылал сигнал, который сообщал что за команда пришла и ее параметр
void Device::newData()
{
    if(bytesAvailable()<=0) return;

    _buffer.append(readAll()); //дописываю в буфер данные что прочитаны

    if(_buffer.size()>=3)
    {
        QRegExp rx("<([0-7])(\\d{0,})>");

        int pos =0;
        while(rx.indexIn(_buffer,pos)!= -1) //накладываю маску
        {
            char command = rx.cap(1).toAscii().at(0); //смотрю что за команда пришла
            int value=0; //какой параметр команды
            int led=0; //какой светодио
            switch(command)
            {
                case (int)LED_NUM:
                    led=rx.cap(2).toInt();
                break;

                case (int)BLINK_PERIOD:
                    value=rx.cap(2).toInt();
                break;

                case (int)LED_BRIGHT:
                    led=rx.cap(2).mid(0,1).toInt();
                    value=rx.cap(2).mid(1,BRIGHT_SIZE).toInt();
                break;

                case (int)ECHO: emit echoFounded(1); break;
            }
            emit innedData((char)command,value,led); //высылаю сигнал о том что принята команда
            _buffer.remove(pos,rx.matchedLength());
            pos+=rx.matchedLength();
        }

        rx.setPattern("error");
        if( (pos=rx.indexIn(_buffer,0)) != -1 )
        {
            _buffer.remove(pos,rx.matchedLength());
            emit errorFounded(0);
        }
    }

}


Затем создал обычный класс, унаследованный от QObject, к котором принимал этот сигнал и просто забивал очередь QQueue. В этом-же классе переопределил свойство void timerEvent(QTimerEvent *); и в нем смотрел, если очередь не пустая, то писал в базу одно первое сообщение очереди и успокаивался. Пришлось извратиться с таймером так, потому что в качестве базы выступала xml таблица на удаленной машине, подключенная через ODBC :D
Stoptyssin,
21.1.2012, 17:29 QT&ZigBee
Цитата(kuzulis @ 21.1.2012, 15:09) *
Чем аргументируешь? Чем оно лучше?


Все равно все от него пляшут :rolleyes:


Цитата(Stoptyssin @ 21.1.2012, 16:52) *
данные полученные с устройства должны сохранятся в архиве, а БД уже обработанные.


А можно сразу нескромный вопрос - "А чем БД плоха в качестве архива?" Вы же, если я не ошибаюсь, MySQL использовать собрались, а там есть такой замечательный тип как Archive. И вообще часть обработки (если не всю) можно положить непосредственно на базу данных. Почитайте про триггеры

Цитата(Stoptyssin @ 21.1.2012, 16:52) *
При этом всем может одновременно идти инфармация от нескольких устройств

Вы что-то там упоминали про ZigBee коллектор, что-то не могу понять как он работает. Он принимает данные с устройств и какает в порт сообщениями типа "Такой-то девайс послал то-то" ? Или он на одно устройство рассчитан?
Stoptyssin,
28.12.2011, 1:13 QString вынуть int
А можно регулярным выражением пройтись. Лично я, если это не критичный кусок кода или чтобы не заморачиваться с позициями, предпочитаю такой вариант. crazymonkey, если у вас еще и длины чисел гуляют, я бы все-таки посмотрел в сторону регулярных выражений. Я не знаю точных подробностей как там у Вас строка может выглядеть, поэтому навскидку накидал пример

    QString str("A_14_R4");
    QRegExp rx("[a-zA-Z]_(\\d+)_[a-zA-Z](\\d+)"); //сам шаблон

    if(rx.indexIn(str,0)!=-1) //нашли вхождение шаблона
    {
        rx.cap(1); //тут у нас первое число
        rx.cap(2); //а тут второе
    }


Удобство в том что при правильно составленном шаблоне сразу и валидацию строки можно произвести быстро :)
crazymonkey,

RSS Текстовая версия Сейчас: 27.11.2024, 6:21