Russian Qt Forum

Qt => Кладовая готовых решений => Тема начата: merke от Август 22, 2010, 15:21



Название: Кладовка готовых решений
Отправлено: merke от Август 22, 2010, 15:21
Вот решил создать кладовку готовых решений на Вашем форуме. Объясню что это: уверен у большинства программеров на харде лежат текстовые файлы с какими то участками кода, функциями, которые когда то были найдены или собственноручно написаны для определенный целей и дабы не потерять данные ценные строки коды они сохраняются куда нибудь в файлик, так как запоминать лень=) Предлагаю тем кто не против поделится своими наработками, выкладывать их в данную тему.

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

Функция центрирования окна по середине монитора

Код:
void MainWindow::centerOnDesktop()
{
    quint16 screenWidth, width, screenHeight, height, x, y;
    QSize windowSize;

    screenWidth = QApplication::desktop()->width();
    screenHeight = QApplication::desktop()->height();
    windowSize = size();
    width = windowSize.width();
    height = windowSize.height();
    x = (screenWidth - width) / 2;
    y = (screenHeight - height) / 2;
    y -= 100;
    move(x, y);
}


 


Название: Re: Кладовка готовых решений
Отправлено: merke от Август 22, 2010, 15:23
Распечатка текста из QTextEdit

Код:
#ifndef QT_NO_PRINTER
    QPrinter printer(QPrinter::HighResolution);
    QPrintDialog *dlg = new QPrintDialog(&printer, this);
    if (textEdit->textCursor().hasSelection())
        dlg->addEnabledOption(QAbstractPrintDialog::PrintSelection);
    dlg->setWindowTitle(tr("Print Document"));
    if (dlg->exec() == QDialog::Accepted) {
        textEdit->print(&printer);
    }
    delete dlg;
#endif


Название: Re: Кладовка готовых решений
Отправлено: merke от Август 22, 2010, 15:24
Удаление повторяющихся элементов в QListWidget

Код:
for (int i = 0; i< ui->listWidget->count(); i++)
        {
            t = 0;
            for (int j = 0; j< ui->listWidget->count(); j++)
            {
                if (ui->listWidget->item(i)->text() == ui->listWidget->item(j)->text())
                {
                    t++;
                    if (t > 1) delete ui->listWidget->takeItem(j);
                }
            }
        }


Название: Re: Кладовка готовых решений
Отправлено: merke от Август 22, 2010, 15:25
Ограничение на ввод определенного количества символов в QTextEdit

Код:
void MainWindow::on_textEdit_textChanged()
{
    ui->label_4->setText(QString::number(ui->textEdit->toPlainText().count()) + QString::fromLocal8Bit(" из 100"));
    if (ui->textEdit->toPlainText().count() >= 100){
        QString str;
        str = ui->textEdit->toPlainText().mid(0, 99);
        ui->textEdit->setText(str);
    }
}


Название: Re: Кладовка готовых решений
Отправлено: SASA от Август 22, 2010, 15:30
Класс автоматического взведения и сброса флага.
Код:
#ifndef FLAGASSISTANT_H
#define FLAGASSISTANT_H

/// Дефайн для быстрого взведения флага спомощью класса CFlagAssistant.
#define COCKFLAG(flagName) CFlagAssistant flagAssistant(&flagName);

/*! \brief Класс автоматического взведения и сброса флага.
* \author SASA.
* \date 2010/08/18
*/
class CFlagAssistant
{
public:
/*! \brief Конструктор.
* \param[in] _flag (\c bool *) - Указатель на флаг, за которым следим.
*/
CFlagAssistant(bool * _flag)
{
m_flag = _flag;
if(m_flag) *m_flag = true;
}
~CFlagAssistant()
{
if(m_flag) *m_flag = false;
}
protected:
bool * m_flag; ///< Флаг за которым следим.
};

#endif // FLAGASSISTANT_H


Название: Re: Кладовка готовых решений
Отправлено: merke от Август 22, 2010, 15:49
Класс нужный. Но напишите маленький пример использования. Если не сложно


Название: Re: Кладовка готовых решений
Отправлено: Пантер от Август 22, 2010, 16:27
Пиплы, приобщайте к сообщению код с примером использования.
А так, стоящая ветка. :) Можно даже прикрепить, если разрастется. Но мне кажется, что лучше отдельный раздел выделить для этого и каждое решение отдельной темой, чтобы легче было искать/смотреть. Кто за?


Название: Re: Кладовка готовых решений
Отправлено: merke от Август 22, 2010, 16:34
Я только ЗА!!!


Название: Re: Кладовка готовых решений
Отправлено: SABROG от Август 23, 2010, 08:21
Функция центрирования окна по середине монитора
А можно это сделать в одну (http://developer.qt.nokia.com/wiki/PlacingWidgetInCenterOfScreen) строчку.


Название: Re: Кладовка готовых решений
Отправлено: merke от Август 23, 2010, 09:52
Здорово, не знал!!! Спасибо!!!


Название: Re: Кладовка готовых решений
Отправлено: SASA от Август 23, 2010, 10:10
Класс нужный. Но напишите маленький пример использования. Если не сложно
Код:
class MyClass
{
public:
MyClass()
{
m_flag = false;
}
/*! Пока исполняется этот метод, флаг должен быть взведённым.
* После выхода из метода, флаг должен сброситься.
*/
void metod()
{
COCKFLAG(m_flag);
много кода c несколькими ретурнами;
}
protected:
m_flag;
};

Самое главное, что изменив код метода (добавив ещё один ретурн) нам не надо писать строку m_flag = false; А про неё так легко забыть  ;). А есть ещё исключения, по которым функция может прерваться где угодно. Класс позволяет легко сохранить условие, описанное в комментарии.


Название: Re: Кладовка готовых решений
Отправлено: Amigo_sa от Август 23, 2010, 10:35
Класс для блокирования виджетов. Удобен в слотах, где запускаются долгие вычисления, чтобы на врымя обработку слота в очередь не складывались другие сигналы от того же виджета.
class CWidgetLocker
{
public:

   CWidgetLocker(QWidget * aWidget)
   {
      m_lockedWidget = aWidget;
      m_lockedWidget->setEnabled(false);
   }

   ~CWidgetLocker()
   {
      m_lockedWidget->setEnabled(true);
   }

private:

   QWidget * m_lockedWidget;
};

Пример.
void TestExecutor::onRunTest()
{
  CWidgetLocker locker(m_testForm.form.btnWinInfoGo);
  ....


Название: Re: Кладовка готовых решений
Отправлено: merke от Август 23, 2010, 11:17
Amigo_sa, здорово!!! Полагаю, очень скоро мне бы как раз понадобился такой класс!!!


Название: Re: Кладовка готовых решений
Отправлено: Sancho_s_rancho от Август 23, 2010, 20:25
Синглтон настроек:
Код:
#ifndef SETTINGS_H
#define SETTINGS_H
#include <QSettings>

class Settings
{
public:
    static QSettings  *Instance(){static QSettings s; return &s; }
private:
    Settings();
    Settings(const Settings&);
    Settings& operator= (const Settings&);


};

#endif // SETTINGS_H


Название: Re: Кладовка готовых решений
Отправлено: Sancho_s_rancho от Август 23, 2010, 20:32
Простой и эффективный шаблонный класс двумерного массива (Дабы не загромождать дам ссылку):
http://www.assembla.com/code/BitmapFontDrawer/git/nodes/src/array2d.h?rev=af73ec646b4ba26b30e37d1e0f06242682c69184 (http://www.assembla.com/code/BitmapFontDrawer/git/nodes/src/array2d.h?rev=af73ec646b4ba26b30e37d1e0f06242682c69184)


Название: Re: Кладовка готовых решений
Отправлено: ритт от Август 24, 2010, 02:38
сразу извиняюсь за флуд (полагаю, Пантер всё-равно потом безжалостно вычистит:Р), но мне кажется, что раздел следовало назвать как-то вроде "кладовка очевидных и порой некорректных решений" :)

> Удаление повторяющихся элементов в QListWidget
сложность O(n^2) ? читайте Кнута )

> Ограничение на ввод определенного количества символов в QTextEdit
QString::fromLocal8Bit() ? нехорошо учить народ таким глупостям...
а по самому решению - форматирование, выделение и пр. будет теряться каждый раз по обрезании текста

> Класс для блокирования виджетов
подразумевает, что время жизни виджета больше, чем время жизни локера, но ни проверок, ни матюгов не наблюдается, что может затруднить отладку глупых сегфолтов (CWidgetLocker locker(0); )
я бы добавил информативный ассерт и член бы сделал константным...

> Синглтон настроек
даже не представляю где/зачем это можно использовать, кроме банальнейших примеров, где оно всё-равно будет только лишние байты занимать...

всё, пинайте.


Название: Re: Кладовка готовых решений
Отправлено: sendevent от Август 24, 2010, 03:07
довольно полезная штука (не кьют-бейзд), периодически выручает еще с института - "Коллекция алгоритмов от Johna Smith, в качестве учебного материала" на винграде.
думаю, не совсем корректно давать тут линк, поэтому больше ничего не скажу :-)


Название: Re: Кладовка готовых решений
Отправлено: Пантер от Август 24, 2010, 06:25
Константин: вот ты злой. ;)
Специально и сделал раздел, чтобы можно было пообсуждать и сделать правильное решение. Вот люди учтут твой наезд и подправят.

ПыСы: А синглтон настроек вполне нормальная вещь.


Название: Re: Кладовка готовых решений
Отправлено: spectre71 от Сентябрь 05, 2010, 00:40
Константин: вот ты злой. ;)
Специально и сделал раздел, чтобы можно было пообсуждать и сделать правильное решение. Вот люди учтут твой наезд и подправят.

ПыСы: А синглтон настроек вполне нормальная вещь.

Он не злой.
Я бы назвал данный раздел "Мусорка решений".

Объясните:
Почему создан данный раздел?
Какова его цель?
Для кого он?
В каких отношениях он состоит с теми же "FAQ", "WIKI"?
А с другими разделами?

И еще. Смешно и грустно:
Цитировать
6. Весь код в этом разделе распространяется под лицензией GNU GPL.
Ура!!! Я нашел решение как сложить A и B:  C = A + B;  ;D
или
Есть такая крутая штука как Синглтон. Ура я придумал QSettihgs-Синглтон. GNU GPL рулез.  8)

И вообще лучше убрать данный пункт!!!
Пример: автор кода, на самом деле не его автор - скачал где-то. Хотите отвечать за ваше GNU GPL.
Ведь не указано что я не могу выложить здесь чужой код.
Опа, появилась еще одна "степень свободы" - стало еще сложнее.

Ой, не надо меня пинать. :)


Название: Re: Кладовка готовых решений
Отправлено: Sancho_s_rancho от Сентябрь 05, 2010, 16:20
2 Spectre

Если следовать вашей логике, то форум является городской свалкой, т.к. элементарнейшие вопросы(пример: "русские буковки выводятся кракозябами") здесь задаются по 1000 раз. Книги о C++ не нужны, т.к. это никчемный пересказ стандарта ISO. Книги о Qt вообще предать анафеме (ну собственно как и Qt assistant), т.к. есть исходники и там все ясно написано.



Название: Re: Кладовка готовых решений
Отправлено: Igors от Сентябрь 05, 2010, 18:45
Ой, не надо меня пинать. :)
Надо-надо  :) На мой взгляд, бесполезно требовать "абсолютно корректных" решений (как делаете Вы и Константин). Так отбивается всякая охота постить сюда (а вдруг раскритикуют, оно мне надо?). Гораздо важнее что есть ИДЕИ и "свежий взгляд", которые можно использовать. Понятно, что не каждый раз (а довольно редко), что те идеи всегда будут сырыми и.т.п. Но кому надо -  технику приложит (было бы к чему).

Поэтому мне кажется разумным ЗАПРЕТИТЬ критику в этом разделе форума - это стандартная практика "brain storming" подхода


Название: Re: Кладовка готовых решений
Отправлено: Karl-Philipp от Сентябрь 05, 2010, 18:57
Запретить - это очень радикально. Мне, например, очень интересно почитать, критику, комментарии и вопросы форумчан по тому или иному решению. Кто-то может предложить что-то более рациональное или чья-то мысль может натолкнуть на другое решение :)


Название: Re: Кладовка готовых решений
Отправлено: SABROG от Сентябрь 05, 2010, 18:59
История повторяется, что и для раздела "Секреты и интересные возможности Qt" на crossplatform.ru. Судя по тому, что в подобных разделах пишут 2-3 человека, то лучше пусть пишут хотя бы что-то. Иногда в полном хламе можно найти интересную идею, которую нужно просто развить.


Название: Re: Кладовка готовых решений
Отправлено: Igors от Сентябрь 05, 2010, 19:12
История повторяется, что и для раздела "Секреты и интересные возможности Qt" на crossplatform.ru. Судя по тому, что в подобных разделах пишут 2-3 человека, то лучше пусть пишут хотя бы что-то. Иногда в полном хламе можно найти интересную идею, которую нужно просто развить.
Я квалифицирую такие посты как "ординарный/банальный цинизм". Вероятно молодой человек испытывает кризис, жизнь кажется ему исключительно "в оттенках черного" (возможно проблемы с девушкой) и.т.п. Это бывает - и это проходит  :)

P.S

Цитировать
Good Golly, said little Miss Molly when she was rockin' in the house of blue light
Tutti Frutti was oh so rooty when she was rockin' to the east and west
Lucille was oh so real when she didn't do her daddies will
Come on baby, drive me crazy--do it, do it
I'm a speed king you go to hear me sing
I'm a speed king see me fly

Ну и так далее  :)


Название: Re: Кладовка готовых решений
Отправлено: m_ax от Сентябрь 06, 2010, 00:02
Цитировать
История повторяется, что и для раздела "Секреты и интересные возможности Qt" на crossplatform.ru. Судя по тому, что в подобных разделах пишут 2-3 человека, то лучше пусть пишут хотя бы что-то. Иногда в полном хламе можно найти интересную идею, которую нужно просто развить.
Присоединяюсь)

Цитировать
История повторяется, что и для раздела "Секреты и интересные возможности Qt" на crossplatform.ru. Судя по тому, что в подобных разделах пишут 2-3 человека, то лучше пусть пишут хотя бы что-то. Иногда в полном хламе можно найти интересную идею, которую нужно просто развить.

Я квалифицирую такие посты как "ординарный/банальный цинизм". Вероятно молодой человек испытывает кризис, жизнь кажется ему исключительно "в оттенках черного" (возможно проблемы с девушкой) и.т.п. Это бывает - и это проходит 
А причём здесь цинизм? Вероятно, если тот, о ком Вы это написали испытывал подобные проблемы, и аж видел жизнь искл. в оттенках чёрного, он едва, на мой взгляд, постил бы здесь с таким энтузиазмом) Скорее депрессировал где-нить на кладбище с собратьями по мировоззрению)

А может создать на форуме, если на то пошло, отдельную тему, типа: психологическая помощь или тема доверия для потерянных больных первертов в мировой Qt-тусовке?))
Igors мог бы быть там модератором))   
 ;)


Название: Re: Кладовка готовых решений
Отправлено: JayFOX от Сентябрь 06, 2010, 00:23
По поводу удаления одинаковых элементов из QListWidget.
В случае если элементы будут расположены в следующем порядке:
a, b, b, b, a, b, b результатом выполнения будет a, b, b, что неверно.
Это происходит потому, что после takeItem количество элементов изменено.
Давайте проверять решения...


Название: Re: Кладовка готовых решений
Отправлено: BRE от Сентябрь 06, 2010, 07:21
По поводу удаления одинаковых элементов из QListWidget.
...
Давайте проверять решения...
На самом деле у этой задачи вообще не должно быть решения.  :)
QListWidget не является коллекцией и туда по определению не должны попасть одинаковые элементы, если они там не нужны.