crossplatform.ru

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

10 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
> Секреты и интересные возможности Qt
void*
  опции профиля:
сообщение 23.7.2008, 22:28
Сообщение #1


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

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


Предлагаю в данную тему скидывать все известные вам интересные фичи и "секреты" Qt. Думаю, так можно собрать неплохую коллекцию интересных возможностей Qt, где каждый сможет найти что-нибудь интересное для себя или узнать новое. Начну сам:
1) Макрос Q_UNUSED позволяет избежать предупреждений по поводу неиспользования какой-то переменной. Пример:
void someFunc(int var) {
     Q_UNUSED(var); //тут мы избавлемся от возможного предупреждения от компилятора
}

2) Функция QString Qt::escape(const QString &plain) позволяет конвертировать в строке, задаваемую параметром plain метасимволы HTML (<, >, &) в их HTML-эквиваленты. Пример:
QString plain = "#include <QtCore>"
QString html = Qt::escape(plain);  // html == #include <QtCore>

3) Макрос Q_PROPERTY позволяет в некоторых случаях избежать приведения. Пример:
class SomeClass : public QObject {
     Q_OBJECT
     Q_PROPERTY(bool prop READ prop WRITE setProp);
private:
     bool var;
public:
     SomeClass() : var(true) { }
     bool prop() const { return var; }
     void setProp(bool newValue) { var = newValue; }
};
//а теперь, имея указатель на QObject, мы можем изменять значения переменных унаследованного класса:
SomeClass *sc = new SomeClass;
QObject *obj = sc;
obj->setProperty("prop", true); //тоже самое, что и sc->setProp(true);


to be continued...

P.S. Надеюсь тема не умрет, и каждый будет ее поддерживать своими находками :)

-----------------------
Ссылки на интересные возможности:
1) QComboBox-Изменение размера выпадающего списка
2) qmake, как обратится к текущему каталогу?

Сообщение отредактировал Litkevich Yuriy - 31.1.2009, 12:52
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 24.7.2008, 9:29
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


P.S. Мне кажется тему можно вверху прикрепить! :)

Не знаю, возможно, это и известный факт, но мне показалось не совсем обычным такое применение функции read/write. При этом применении она становится аналогом функций Windows Api ::ReadFile/::WriteFile:

    _str strIn;
    QFile f1("nt.dat");
    f1.open(QIODevice::WriteOnly);
    f1.write( (const char *)&strIn, sizeof( strIn));
    f1.close();

    _str strOut;
    strOut.n = .0123;
    strOut.s = "test";
    strOut.y = 1;

    QFile f2("nt.dat");
    f2.open(QIODevice::ReadOnly);
    f2.read( (char *)&strOut, sizeof( strOut));
    f2.close();

В данном коде, тип _str - это пользовательский тип. В функциях read/write считываются в эту структуру данные указанного типа при преобразовании в const char*, а не в void*!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 24.7.2008, 9:36
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


void*, для 1-го пункта часто имя переменной коментируют, чтоб компиллер не ругался:
void someFunc(int /*var*/) {
     ...
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 24.7.2008, 10:09
Сообщение #4


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

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


LitkevichВ Yuriy, приколупался :) лучше бы продолжил идею :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 24.7.2008, 10:16
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Цитата(AD @ 24.7.2008, 13:29) *
Не знаю, возможно, это и известный факт, но мне показалось не совсем обычным такое применение функции read/write. При этом применении она становится аналогом функций Windows Api ::ReadFile/::WriteFile:

Оно вполне обычное - сохранение буфера.
Но мне кажется, код у тебя не правильный.
Если сохранение/восстановление происходят в разных программах, или даже при разных запусках одной программы, в поле strOut.s с большой вероятностью будет мусор.

Сообщение отредактировал Tonal - 24.7.2008, 10:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 24.7.2008, 10:33
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Tonal @ 24.7.2008, 11:16) *
Оно вполне обычное - сохранение буфера.
Но мне кажется, код у тебя не правильный.
Если сохранение/восстановление происходят в разных программах, или даже при разных запусках одной программы, в поле strOut.s с большой вероятностью будет мусор.

не совсем понял почему неправильный. Но он исправно работает. Проверял на нескольких машинах! ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ЙаМайскЫйПчОЛ
  опции профиля:
сообщение 24.7.2008, 11:12
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 154
Регистрация: 10.7.2008
Из: СПб
Пользователь №: 232

Спасибо сказали: 7 раз(а)




Репутация:   5  


Цитата(AD @ 24.7.2008, 10:29) *
Не знаю, возможно, это и известный факт, но мне показалось не совсем обычным такое применение функции read/write. При этом применении она становится аналогом функций Windows Api ::ReadFile/::WriteFile:

Это обычно для программирования под *nix'ы read/write можно применить для любого дескриптора, в т.ч. для дескриптора файла, а файл в *nix'ах это всё что есть и может быть в системе. )))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 24.7.2008, 11:48
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Цитата(AD @ 24.7.2008, 14:33) *
Цитата(Tonal @ 24.7.2008, 11:16) *
...в поле strOut.s с большой вероятностью будет мусор.

не совсем понял почему неправильный. Но он исправно работает. Проверял на нескольких машинах! ;)

1) Как объявлено поле _str.s? Как char* ?
2) На что указывает поле strIn.s перед сохранением (где живёт массив символов)?
3) Как ты думаешь, что именно сохраняется в файле на месте соответствующем полю _str.s?
4) Что будет находится в поле strOut.s после чтения?
5) Куда будет указывать поле strOut.s в другой программе?
Или в этой же, если выполнится например вот такой код:
char* buf = new char[10];
_str strIn;
strIn.s = buf;
f1.write( (const char *)&strIn, sizeof( strIn));
delete[] buf;
_str strOut;
f2.read( (char *)&strOut, sizeof( strOut));
cout<<strOut.s<<endl; //???


P.S. В своём первом посте, ты strOut и strIn местами не перепутал? :)
P.P.S Если я ошибся в первом предположении, и поле _str.s имеет тип строки (QString, или std::string, или ещё какой), задумайся, как он устроен, и где хранятся те символы, которые представляют строку.

Сообщение отредактировал Tonal - 24.7.2008, 11:50
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 25.7.2008, 23:26
Сообщение #9


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

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


Собственно продолжение. Простенький пример того, что можно сделать с помощью Qt Style Sheets. Скомпилируйте это у себя и зацените кнопочку:
#include <QtGui>
int main(int argc, char **argv) {
    QApplication app(argc, argv);
    QPushButton btn;
    
    qApp->setStyleSheet(
          "QPushButton {"
             "border: 1px solid #000000;"
             "border-radius: 10px;"
             "background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,"
                                               "stop: 0 #dedede, stop: 0.5 #434343, stop: 0.51 #000000, stop: 1 #656a6d);"
             "min-width: 80px;"
         "}"

         "QPushButton:pressed {"
             "background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,"
                                               "stop: 0 #cfcccc, stop: 0.5 #333232, stop: 0.51 #000000, stop: 1 #585c5f);"
         "}"

         "QPushButton:flat {"
             "border: none; "
         "}"
         );
    btn.resize(100, 50);
    btn.show();
    return app.exec();
}

думаю вам понравится :)

Сообщение отредактировал void* - 25.7.2008, 23:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Петров Виталий
  опции профиля:
сообщение 18.9.2008, 8:31
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 29
Регистрация: 8.1.2008
Пользователь №: 63

Спасибо сказали: 2 раз(а)




Репутация:   0  


Тоже поделюсь парой интересных моментов.

1) Если вы не используете потоки. но при этом имеется к примеру большой цикл, то интерфейс приложения может блокироваться и не перерисовывается.
Чтобы решить эту проблему можно вызывать метод QApplication::processEvents(); при каждой итерации цикла.

2) Сделать фон любого виджета прозрачным можно так:

listwidget->setFrameShape(QFrame::NoFrame);
listwidget->viewport()->setAutoFillBackground(false);

это может пригодится например, если вы пишете плазмоид для kde4 а в плазме пока нет некоторых нативных прозрачных виджетов =)))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

10 страниц V   1 2 3 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 3.12.2020, 13:03