Просмотр сообщений
|
Страниц: 1 ... 29 30 [31] 32
|
451
|
Qt / Вопросы новичков / Re: Вопрос о QPushButton (toggle)
|
: Март 04, 2012, 20:13
|
Я бы использовал C++ (Qt) bool QObject::setProperty ( const char * name, const QVariant & value ) QObject * QObject::sender () const [protected]
В конструкторе C++ (Qt) for (int i = 0; i < 5; i++) { QPushButton *Button = new QPushButton; Button->setCheckable(true); Button->setProperty("NumOfButton", i); connect(Button , SIGNAL(toggled(bool)), this, SLOT(onButtonToggled(bool))); ui->gridLayout->addWidget(Button,i,1); }
в слоте onButtonToggled(bool): C++ (Qt) if (!sender()) return; QPushButton *button = qobject_cast<QPushButton*> (sender()); int numOfButton = button->property("NumOfButton").toInt(); //.....
|
|
|
454
|
Qt / Вопросы новичков / Re: Нажатие клавиш
|
: Февраль 29, 2012, 15:20
|
Огромное спасиба,за ваш труд!!!!!Но вы бы не могли объяснить как работает даная программа,в часности не пойму даный код event->type() == QEvent::KeyPress ? b = true : b = false; Потому что теперь мой танк может стрелять и ехать одновременно только когда обе клавиши нажаты,тоесть если я просто нажму и сразу отпущю кнопку ,предположим огня,то он остановится,если одновремменно удерживать кнопку огня и движения то все работает(только почемуто он ускоряется )? Та строчка аналогична C++ (Qt) if (event->type() == QEvent::KeyPress) b = true; else b = false;
То есть если событие QEvent::KeyPress, то разрешаем движение/стрельбу, иначе (событие QEvent::KeyRelease) запрещаем. Если тебе надо, что бы объект продолжал движение и после отпускания кнопок - просто не обрабатывай событие QEvent::KeyRelease для кнопок движения, а в обработчике QEvent::KeyPress назначай значение false всем переменным движения, кроме последнего. Плохой из меня учитель, но как мог
|
|
|
455
|
Qt / Вопросы новичков / Re: Нажатие клавиш
|
: Февраль 28, 2012, 23:33
|
Навскидку примерно так: main.cpp C++ (Qt) #include <QApplication> #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
mainwindow.h C++ (Qt) #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QLabel> #include <QSet> class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); signals: public slots: protected: bool eventFilter(QObject *obj, QEvent *event); void updateKeys(); private: QLabel *label; bool upKey, downKey, rightKey, leftKey, fireKey; }; #endif // MAINWINDOW_H
mainwindow.cpp C++ (Qt) #include "mainwindow.h" #include <QEvent> #include <QKeyEvent> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { label = new QLabel(this); installEventFilter(this); setCentralWidget(label); upKey = downKey = rightKey = leftKey = fireKey = false; } bool MainWindow::eventFilter(QObject *obj, QEvent *event) { if (event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease) { QKeyEvent* ke = static_cast<QKeyEvent*>(event); bool b; event->type() == QEvent::KeyPress ? b = true : b = false; switch(ke->key()) { case Qt::Key_Up: upKey = b; break; case Qt::Key_Down: downKey = b; break; case Qt::Key_Right: rightKey = b; break; case Qt::Key_Left: leftKey = b; break; case Qt::Key_Space: fireKey = b; break; } updateKeys(); return true; } return QObject::eventFilter(obj, event); } void MainWindow::updateKeys() { QString text; if (upKey) text.append("Up "); if (downKey) text.append("Down "); if (rightKey) text.append("Right "); if (leftKey) text.append("Left "); if (fireKey) text.append("Fire "); label->setText(text); }
|
|
|
457
|
Qt / Вопросы новичков / Re: QLineEdit нажать
|
: Февраль 28, 2012, 20:39
|
Если тебе надо при получению фокуса клавиатурой менять цвет, а при потери фокуса - восстанавливать, то переопределять C++ (Qt) void focusInEvent(QFocusEvent *); void focusOutEvent(QFocusEvent *);
Или использовать void QObject::installEventFilter ( QObject * filterObj ), что бы обойтись без наследования.
|
|
|
458
|
Qt / Общие вопросы / Re: Как преобразовать строку QString
|
: Февраль 27, 2012, 17:52
|
Только сейчас заметил, что в окно вывода ты QByteArray выводишь - ну дык и не будет русских букв там (в смысле в окне) никогда, ибо QtCreator скомпилирован с поддержкой уникода, a QByteArray этого самого уникода не понимает.
|
|
|
459
|
Qt / Общие вопросы / Re: Как преобразовать строку QString
|
: Февраль 27, 2012, 17:25
|
ну по ходу кирилица. Кирилических кодировок > 1 Нужно чтоб в "QByteArray s" присвоился "тест". тоесть если сделать: то чтоб вывелось слово "тест" Нужно копать в сторону класса QTextCodec и его функций setCodecForCStrings() и setCodecForLocale().
|
|
|
460
|
Qt / Вопросы новичков / Re: Передача массива в метод класса
|
: Февраль 27, 2012, 11:00
|
И да, код C++ (Qt) void test::FullTestAdapter(QString Data[11][11]) { DataTester = Data; }
а именно часть C++ (Qt) DataTester = Data;
не пройдет, ибо в с++ возможна лишь поэлементное копирование массивов, так как массив в с++ по сути есть указатель.
|
|
|
461
|
Qt / Вопросы новичков / Re: Передача массива в метод класса
|
: Февраль 27, 2012, 10:48
|
Тебе же компилятор подсказывает, где именно проблема. C++ (Qt) #include <QtCore/QCoreApplication> #include <QDebug> void print (QString (*array)[11]) { for (int i = 0; i <11 ; ++ i) for (int x = 0; x < 11;++x) qDebug() << array[i][x]; } int main(int argc, char *argv[]) { QString array[11][11]; for (int i = 0; i <11 ; ++ i) for (int x = 0; x < 11;++x) array[i][x] = QString("%0 - %1").arg(i).arg(x); print(array); }
А вообще стоит почитать, что представляют собой встроенные массивы в С++.
|
|
|
462
|
Qt / Общие вопросы / Re: Автомат, или фиксированная последовательность. Как?
|
: Февраль 21, 2012, 09:36
|
10+ последовательностей, самая маленькая - 8 функций. Каждый раз в очередь пихать - интересно, но маловнятно. Создать 10+ очередей - интересно, но как тогда вызывать пятый элемент последовательности? А ты мой ответ видел? Там как раз без очередей и с любого места, и не надо каждый раз в очередь ничего пихать.
|
|
|
463
|
Qt / Общие вопросы / Re: Автомат, или фиксированная последовательность. Как?
|
: Февраль 21, 2012, 09:15
|
Можно сделать через указатели на функции и любой из контейнеров, кот. тебе удобней. Например: C++ (Qt) #include <QtCore/QCoreApplication> #include <QVector> #include <QDebug> QVector<void(*)()> vecOfFunc; void func0() { qDebug() << "func0"; } void func1() { qDebug() << "func1"; } void func2() { qDebug() << "func2"; } void func3() { qDebug() << "func3"; } void func4() { qDebug() << "func4"; } void startFrom(int i) { if (vecOfFunc.size() <= i) return; for (; i < vecOfFunc.size(); ++i) (*vecOfFunc.at(i))(); } int main(int argc, char *argv[]) { vecOfFunc.append(func0); vecOfFunc.append(func1); vecOfFunc.append(func2); vecOfFunc.append(func3); vecOfFunc.append(func4); startFrom(2); }
that is all update: через QStateMachine сделать можно, но будет еще более неудобно и путано, чем через switch'и.
|
|
|
464
|
Разное / Говорилка / Re: двумерный массив
|
: Февраль 19, 2012, 18:59
|
Собственно пример на структуре. Все просто и понятно #include <QtCore/QCoreApplication> #include <QDebug> #include <QVector> #include <QStringList>
struct X { int a; int b; QString c; };
bool lessThan(const X &x1, const X &x2) { return x1.a > x2.a; }
int main(int argc, char *argv[]) {
//создание QVector<X> vecOfX; X x; for (int i = 0; i < 100; ++i) {
x.a = i; x.b = i+202; x.c = QString("bla%0").arg(i+1); vecOfX.append(x); } //вставка x.a = 555; x.b = 2341; x.c = "bla556"; vecOfX.insert(50, x);
//прогонка foreach (X x1, vecOfX) { qDebug() << x1.a << x1.b << x1.c; } //сортировка в обратрую сторону по X.a qSort(vecOfX.begin(), vecOfX.end(), lessThan);
foreach (X x1, vecOfX) { qDebug() << x1.a << x1.b << x1.c; } }
|
|
|
465
|
Разное / Говорилка / Re: двумерный массив
|
: Февраль 19, 2012, 18:20
|
эээ а как ща элементы правильно вставить? прогнать отсортировать перемешать (необязательно)
1. void QVector::insert ( int i, const T & value ) 2. foreach 3. qSort 4. Вроде нет возможности "из коробки", самому реализовывать надо.
|
|
|
|
|