Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как реализовать аналог бегущей строки? Полный контроль расположения текста... 
:(
    Опции темы
KL7
Дата 5.8.2009, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.12.2008
Где: Minsk City

Репутация: 2
Всего: 2



Цитата(Любитель @  5.8.2009,  07:50 Найти цитируемый пост)
Привязываться к стайлшитам не есть гуд. 

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

не хотелось бы разводить много тем, так что еще спрошу:
покажите, где почитать про private-классы (например, QLabel активно взаимодействует с QLabelPrivate), которые нередко в Qt используются... хоть какую-то информацию о том, каково предназначение и как использовать ету технологию... она ведь наверняка как-то обоснована...

PM MAIL ICQ   Вверх
Любитель
Дата 5.8.2009, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 16
Всего: 92



Цитата(KL7 @  5.8.2009,  08:35 Найти цитируемый пост)
и если нужна полноценная поддержка чего-то наподобие скинов, то надо читать в сторону стилей?

Стайлшиты реализуются через QStyleSheetStyle. Только его почему-то решили сделать недокументированным.. Но тем не менее - это один из стилей.

Цитата(KL7 @  5.8.2009,  08:35 Найти цитируемый пост)
покажите, где почитать про private-классы (например, QLabel активно взаимодействует с QLabelPrivate), которые нередко в Qt используются... хоть какую-то информацию о том, каково предназначение и как использовать ету технологию... она ведь наверняка как-то обоснована...

Ну, по сути классический с++-ный паттерн PImpl. Преимущество в отсутствии необходимости вынесения деталей в хидер. Ведь даже при изменении прайват данных класса мы должны перекомпилировать всё, что использует этот класс (всмысле использует класс, а не используется классом). Выделение же отдельного внутреннего класса + указатель на объект этого класса в хидере позволяет этого избежать.

Другими словами - это общепринятый костыль smile Впрочем, при привычке - достаточно удобный.


--------------------
PM MAIL ICQ Skype   Вверх
KL7
  Дата 8.8.2009, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.12.2008
Где: Minsk City

Репутация: 2
Всего: 2



Цитата(Любитель @  5.8.2009,  08:48 Найти цитируемый пост)
Ну, по сути классический с++-ный паттерн PImpl.

во-первых, спасибо за информацию =) почитал, стало гораздо понятнее... пытался применить в данном проекте, но пока и без новых паттернов проблем хватает, но в будущем буду знакомится с такими вещами...

а теперь... мой виджет... функциональность реализована примерно на 80% =) Т.е. он уже почти умеет все, что должен...
но качество реализации не важное...  smile 

собственно код...

main.cpp
Код

#include <QApplication>
#include <QVBoxLayout>
#include "typingarea.h"

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget *window = new QWidget;
    window->setWindowTitle("Input Area");

    TypingArea *input = new TypingArea;
    input->setText(QString::fromLocal8Bit("Standing in the middle of the road is dangerous, you will get knocked down by the traffic from both directions."));

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addStretch(50);
    layout->addWidget(input);
    layout->addStretch(50);
    window->setLayout(layout);

    window->show();

    return app.exec();
}



typingarea.h
Код

#ifndef INPUTAREA_H
#define INPUTAREA_H

#include <QFrame>

class QBasicTimer;

class TypingArea : public QFrame{
    Q_OBJECT
public:
    TypingArea(QWidget* = 0);

    QSize sizeHint() const;
    QSize minimumSizeHint() const;

    QString getText() const;
    int getTypedTextPercent() const;
    int getFrameWidth() const;
    int getFrameRadius() const;
    int getTextMargin() const;
    QColor getFrameColor() const;
    QColor getBackColor() const;
    QColor getTypedMaskColor() const;
    QColor getTextColor() const;
    QColor getCurSymbolColor() const;
    QFont getTextFont() const;

public Q_SLOTS:
    void setText(QString, int = 0);
    void setTypedTextPercent(int);
    void setFrameWidth(int);
    void setFrameRadius(int);
    void setTextMargin(int);
    void setFrameColor(QColor);
    void setBackColor(QColor);
    void setTypedMaskColor(QColor);
    void setTextColor(QColor);
    void setCurSymbolColor(QColor);
    void setTextFont(QFont);

protected:
    void paintEvent(QPaintEvent *);
    void keyPressEvent(QKeyEvent *);
    void timerEvent(QTimerEvent *);

private:
    QBasicTimer *shiftTimer;
    
    enum {
        MIN_TEXT_LENGTH = 15,
        NORMAL_TEXT_LENGTH = 30,
        TYPED_TEXT_PERCENT = 25,
        SHIFT_STEPS = 10,
        SHIFT_INTERVAL = 10,
        CUR_SYMBOL_ZOOM = 120
    };

    QString text;
    QString errorText;
    int curSymbol;

    int typedTextPercent;
    int shift;
    int shiftStep;

    int frameWidth;
    int frameRadius;
    int textMargin;
    QColor frameColor;
    QColor backColor;
    QColor typedMaskColor;
    QColor textColor;
    QColor curSymbolColor;
    QFont textFont;

    QString frameStylesheet() const;

    QRect fullBackRect() const;
    QRect leftBackRect() const;
    QRect rightBackRect() const;
    QRect fullTextRect() const;
    QRect leftTextRect() const;
    QRect rightTextRect() const;

    int stringWidth(QString);
    void drawFrame(QPainter &);
    void drawText(QPainter &);
    void drawErrorText(QPainter &);
};

#endif



typingarea.cpp
Код

#include <QtGui>
#include "typingarea.h"

TypingArea::TypingArea(QWidget *parent) : QFrame(parent) {
    text = "";
    errorText = "";

    textFont = QFont("Comic Sans MS", 35, QFont::Bold, false);
    frameWidth = 6;
    frameRadius = 8;
    textMargin = 6;
    textColor.setRgb(129, 86, 60);
    curSymbolColor.setRgb(12, 208, 218);
    frameColor.setRgb(197, 174, 2);
    backColor.setRgb(255, 224, 97);
    typedMaskColor.setRgb(160, 160, 160, 170);

    shiftTimer = new QBasicTimer();

    typedTextPercent = TYPED_TEXT_PERCENT;
    shift = 0;

    setStyleSheet(styleSheet() + frameStylesheet());
    setFont(textFont);
    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
    setFocusPolicy(Qt::StrongFocus);
    setFixedHeight(sizeHint().height());
}

//--------------------------------------------------------------------
//--------------------------------------------------------------------

void TypingArea::paintEvent(QPaintEvent *event) {
    QPainter painter(this);
    painter.fillRect(fullBackRect(), backColor);
    drawText(painter);
    painter.fillRect(leftBackRect(), typedMaskColor);
    if(!errorText.isEmpty()) {
        painter.fillRect(rightBackRect(), QColor(255, 0, 0, 210));
        drawErrorText(painter);
    }
    drawFrame(painter);
}

void TypingArea::keyPressEvent(QKeyEvent *event) {
    if(event->key() == Qt::Key_Backspace) {
        if(!errorText.isEmpty())
            errorText.remove(errorText.length() - 1, 1);
        update(fullBackRect());
        return;
    }

    if(event->text().isEmpty() || curSymbol >= text.length()) {
        QWidget::keyPressEvent(event);
        return;
    }

    if((errorText.isEmpty()) && (event->text()[0] == text[curSymbol])) {
        shiftTimer->stop();
        shift += fontMetrics().width(text[curSymbol]);
        shiftStep = shift / SHIFT_STEPS;
        shiftTimer->start(SHIFT_INTERVAL, this);
        curSymbol++;
    } else {
        errorText += event->text();
        update(fullBackRect());
    }
}

void TypingArea::timerEvent(QTimerEvent *event) {
    if(event->timerId() == shiftTimer->timerId()) {
        if(shift > shiftStep) {
            shift -= shiftStep;
        } else {
            shift = 0;
            shiftTimer->stop();
        }
        update(fullBackRect());
    }
}

QSize TypingArea::sizeHint() const {
    int w = NORMAL_TEXT_LENGTH * fontMetrics().width('x')
         + 2 * (textMargin + frameWidth);
    int h = fontMetrics().height() * CUR_SYMBOL_ZOOM / 100
            + 2 * (textMargin + frameWidth);

    return QSize(w, h);
}

QSize TypingArea::minimumSizeHint() const {
    int w = MIN_TEXT_LENGTH * fontMetrics().width('x')
            + 2 * (textMargin + frameWidth);
    int h = fontMetrics().height() * CUR_SYMBOL_ZOOM / 100
            + 2 * (textMargin + frameWidth);

    return QSize(w, h);
}

//--------------------------------------------------------------------
//--------------------------------------------------------------------

void TypingArea::drawFrame(QPainter &painter) {
    QStyleOptionFrameV3 opt;
    opt.initFrom(this);
    style()->drawPrimitive(QStyle::PE_Frame, &opt, &painter, this);
}

void TypingArea::drawText(QPainter &painter) {
    painter.save();
    painter.setClipRect(fullTextRect());

    QFont curSymbolFont = textFont;
    curSymbolFont.setPointSizeF(curSymbolFont.pointSizeF() * CUR_SYMBOL_ZOOM / 100);

    painter.setPen(textColor);
    painter.setFont(textFont);
    painter.drawText(leftTextRect().adjusted(0, 0, shift, 0),
            Qt::AlignRight | Qt::AlignVCenter | Qt::TextSingleLine | Qt::NoClip,
            text.mid(0, curSymbol));

    painter.setPen(curSymbolColor);
    painter.setFont(curSymbolFont);
    painter.drawText(rightTextRect().adjusted(shift, 0, 0, 0),
            Qt::AlignLeft | Qt::AlignVCenter | Qt::TextSingleLine | Qt::NoClip,
            text.mid(curSymbol, 1));

    int curSymbolWidth = painter.fontMetrics().width(text[curSymbol]);

    painter.setPen(textColor);
    painter.setFont(textFont);
    painter.drawText(rightTextRect().adjusted(shift + curSymbolWidth, 0, 0, 0),
            Qt::AlignLeft | Qt::AlignVCenter | Qt::TextSingleLine | Qt::NoClip,
            text.mid(curSymbol + 1));

    painter.restore();
}

void TypingArea::drawErrorText(QPainter &painter) {
    painter.save();

    painter.setPen(Qt::white);
    QRect boundRect = painter.boundingRect(rightTextRect(),
            Qt::AlignLeft | Qt::AlignVCenter | Qt::TextSingleLine | Qt::NoClip, errorText);

    painter.setClipRect(rightTextRect());
    if(boundRect.width() <= rightTextRect().width())
        painter.drawText(rightTextRect(),
                Qt::AlignLeft | Qt::AlignVCenter | Qt::TextSingleLine | Qt::NoClip,
                errorText);
    else
        painter.drawText(rightTextRect(),
                Qt::AlignRight | Qt::AlignVCenter | Qt::TextSingleLine | Qt::NoClip,
                errorText);

    painter.restore();
}


QString TypingArea::frameStylesheet() const {
    QString col = QString("rgb(%1, %2, %3)").arg(frameColor.red())
            .arg(frameColor.green()).arg(frameColor.blue());

    QString ss = QString("TypingArea { "
                "border-style: solid; "
                "border-width: %1px; "
                "border-radius: %2px;"
                "padding: %3px; "
                "border-color: %4; }").arg(frameWidth).arg(frameRadius)
                .arg(textMargin).arg(col);
    return ss;
}

int TypingArea::stringWidth(QString str) {
    QPainter painter(this);
    QRect oldRect = painter.boundingRect(rightTextRect(),
            Qt::AlignLeft | Qt::AlignVCenter | Qt::TextSingleLine | Qt::NoClip, str);
    QRect newRect = painter.boundingRect(leftTextRect(),
            Qt::AlignRight | Qt::AlignVCenter | Qt::TextSingleLine | Qt::NoClip, str);
    return oldRect.left() - newRect.left();
}

QRect TypingArea::leftBackRect() const {
    return fullBackRect().adjusted(0, 0, - fullBackRect().width()
            * (100 - typedTextPercent) / 100, 0);
}

QRect TypingArea::rightBackRect() const {
    return fullBackRect().adjusted(fullBackRect().width()
            * typedTextPercent / 100, 0, 0, 0);
}

QRect TypingArea::fullBackRect() const {
    return rect().adjusted(frameWidth, frameWidth, -frameWidth, -frameWidth);
}

QRect TypingArea::leftTextRect() const {
    return leftBackRect().adjusted(textMargin, 0, 0, 0);
}

QRect TypingArea::rightTextRect() const {
    return rightBackRect().adjusted(0, 0, -textMargin, 0);
}

QRect TypingArea::fullTextRect() const {
    return fullBackRect().adjusted(textMargin, 0, -textMargin, 0);
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------

QString TypingArea::getText() const { return text; }
int TypingArea::getTypedTextPercent() const { return typedTextPercent; }
int TypingArea::getFrameWidth() const { return frameWidth; }
int TypingArea::getFrameRadius() const { return frameRadius; }
int TypingArea::getTextMargin() const { return textMargin; }
QColor TypingArea::getFrameColor() const { return frameColor; }
QColor TypingArea::getBackColor() const { return backColor; }
QColor TypingArea::getTypedMaskColor() const { return typedMaskColor; }
QColor TypingArea::getTextColor() const { return textColor; }
QColor TypingArea::getCurSymbolColor() const { return curSymbolColor; }
QFont TypingArea::getTextFont() const { return textFont; }

void TypingArea::setText(QString text, int curSymbol) {
    this->text = text;
    this->curSymbol = curSymbol;
}

void TypingArea::setTypedTextPercent(int typedTextPercent) {
    this->typedTextPercent = typedTextPercent;
}

void TypingArea::setFrameWidth(int frameWidth) { this->frameWidth = frameWidth; }
void TypingArea::setFrameRadius(int frameRadius) { this->frameRadius = frameRadius; }
void TypingArea::setTextMargin(int textMargin) { this->textMargin = textMargin; }
void TypingArea::setFrameColor(QColor frameColor) { this->frameColor = frameColor; }
void TypingArea::setBackColor(QColor backColor) { this->backColor = backColor; }
void TypingArea::setTypedMaskColor(QColor typedMaskColor) {
    this->typedMaskColor = typedMaskColor;
}
void TypingArea::setTextColor(QColor textColor) { this->textColor = textColor; }
void TypingArea::setCurSymbolColor(QColor curSymbolColor) {
    this->curSymbolColor = curSymbolColor;
}
void TypingArea::setTextFont(QFont textFont) { this->textFont = textFont; }



1. Буду благодарен за любую критику (как в сторону реализации, так и в сторону грамотности кода). Только не в слишком грубой форме.

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

Анимацию я реализовал как сумел. Етот код у меня на староватом компе вроде как работает, но как только я меняю величину шрифта с 35 на 55, то все начинает жутко виснуть.
Размер шрифта должен лишь зумировать виджет, а скорость отклика должна сохранится.... Но виджет начинает реагировать гораздо хуже и буковки ползут раз в пять медленее...
Хотелось бы решить ету проблему, так что нужен совет и пояснение, что же тут не так...

Заранее приношу большие извинения за отсутствие каких-либо комментариев. 
И буду искренне благодарен, если Вы (абстрактный программист) не заленитесь почитать етот быть может не слишком достойный код...

PS
как заставить eclipse по Ctrl+Tab мирно ходить по всем вкладкам, а не только по двум последним?  smile 
PM MAIL ICQ   Вверх
SABROG
Дата 8.8.2009, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(KL7 @  8.8.2009,  18:30 Найти цитируемый пост)
1. Буду благодарен за любую критику (как в сторону реализации, так и в сторону грамотности кода). Только не в слишком грубой форме.

На самом деле хотелось бы больше скриншотов и аттач с исходниками. На форуме не удобно изучать код.

Цитата(KL7 @  8.8.2009,  18:30 Найти цитируемый пост)
    textFont = QFont("Comic Sans MS", 35, QFont::Bold, false);

Тут, я так понимаю, приносится в жертву кроссплатформенность библиотеки.

Цитата(KL7 @  8.8.2009,  18:30 Найти цитируемый пост)
class TypingArea : public QFrame{

В чем необходимость наследования от QFrame, если рамку можно нарисовать самому?

Цитата(KL7 @  8.8.2009,  18:30 Найти цитируемый пост)
class QBasicTimer;

Возможно это лишнее. Более базового таймера чем QObject::startTimer() и QObject::timerEvent() еще не придумали.

Цитата(KL7 @  8.8.2009,  18:30 Найти цитируемый пост)
QString TypingArea::getText() const { return text; }
int TypingArea::getTypedTextPercent() const { return typedTextPercent; }
int TypingArea::getFrameWidth() const { return frameWidth; }
int TypingArea::getFrameRadius() const { return frameRadius; }
int TypingArea::getTextMargin() const { return textMargin; }
QColor TypingArea::getFrameColor() const { return frameColor; }
QColor TypingArea::getBackColor() const { return backColor; }
QColor TypingArea::getTypedMaskColor() const { return typedMaskColor; }
QColor TypingArea::getTextColor() const { return textColor; }
QColor TypingArea::getCurSymbolColor() const { return curSymbolColor; }
QFont TypingArea::getTextFont() const { return textFont; }

Не знаю как остальные программисты, но я предпочитаю подобные методы оставлять в хедерах с ключевым словом inline.

Цитата(KL7 @  8.8.2009,  18:30 Найти цитируемый пост)
Но виджет начинает реагировать гораздо хуже и буковки ползут раз в пять медленее...

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


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
KL7
  Дата 9.8.2009, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.12.2008
Где: Minsk City

Репутация: 2
Всего: 2



Цитата(SABROG @  8.8.2009,  22:20 Найти цитируемый пост)
На самом деле хотелось бы больше скриншотов и аттач с исходниками. На форуме не удобно изучать код.

Цитата(SABROG @  8.8.2009,  22:20 Найти цитируемый пост)
Возможно это лишнее. Более базового таймера чем QObject::startTimer() и QObject::timerEvent() еще не придумали.

Цитата(SABROG @  8.8.2009,  22:20 Найти цитируемый пост)
Не знаю как остальные программисты, но я предпочитаю подобные методы оставлять в хедерах с ключевым словом inline.

завтра исправлюсь...

Цитата(SABROG @  8.8.2009,  22:20 Найти цитируемый пост)
Тут, я так понимаю, приносится в жертву кроссплатформенность библиотеки.

Что имеется ввиду? 
В принципе это значение по умолчанию временно и оно будет пересмотрено =)

Цитата(SABROG @  8.8.2009,  22:20 Найти цитируемый пост)
В чем необходимость наследования от QFrame, если рамку можно нарисовать самому?

Рамка и рисуется самостоятельно, т.е. через drawPrimitive, а наследование осталось из-за первоначальных задумок. 
Надо заменить на QWidget

Цитата(SABROG @  8.8.2009,  22:20 Найти цитируемый пост)
Надо проанализировать профайлером. Возможно косяк в коде. Может быть готовую картинку можно закэшировать и всего-лишь двигать по виджету. 

Примерно представляю, что такое профайлер, но если не трудно - задайте направление, где почитать.
Кэширование, думаю, возможно, но над етим надо поработать. Несколько вариантов более простой оптимизации уже придумал. А ошибка в коде очень вероятно... Пару дней назад я в paintEvent вызывал унаследованный от QFrame метод drawFrame - виджет перерисовывался без остановки и все сильно висло. Потратил не мало времени, пока разобрался.

PM MAIL ICQ   Вверх
SABROG
Дата 9.8.2009, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(KL7 @  9.8.2009,  00:18 Найти цитируемый пост)
Что имеется ввиду? 

Шрифт.

Цитата(KL7 @  9.8.2009,  00:18 Найти цитируемый пост)
Примерно представляю, что такое профайлер, но если не трудно - задайте направление, где почитать.

gprof


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
KL7
Дата 9.8.2009, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.12.2008
Где: Minsk City

Репутация: 2
Всего: 2



Цитата(SABROG @  9.8.2009,  08:42 Найти цитируемый пост)
Шрифт.

это я понял... Вы хотели сказать, что Comic Sans есть далеко не на всех платформах или что?

Цитата(SABROG @  9.8.2009,  08:42 Найти цитируемый пост)
gprof 

почитал... в принципе разобрался... Но судя по тому, что я нашел, для работы с qt и gprof необходимо все библиотеки пересобрать в статик с параметром -pg. Если сам не смогу решить проблему, то все же пересоберу.

Кое-какие корректировки в коде сделал. Лучше работать пока не стало.  smile 

------ edited -----
только что договорился с gprof, буду изучать...
а наибольшие временные затраты идут на drawText... чем больше (по размерам!) текст, тем труднее приходится процессору... я оптимизировал код, но все равно на большом размере шрифта подтормаживает... буду думать

Это сообщение отредактировал(а) KL7 - 10.8.2009, 13:48
PM MAIL ICQ   Вверх
DK2
Дата 26.4.2011, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



Подскажите как получить значение текста из QTextEdit
PM MAIL   Вверх
borisbn
Дата 27.4.2011, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



DK2, ты чего ? Задаёшь вопрос в чужой теме, в которой уже почти 2 года не было обновлений  smile  smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
DK2
Дата 27.4.2011, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



темой ошибся. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1174 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.