Russian Qt Forum
Май 18, 2024, 06:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 3 4 [5] 6 7 ... 43
61  Qt / Общие вопросы / Re: QScopedPointer forward declaration : Май 27, 2011, 01:03
Если деструктор MyClass объявлен, то удаление "инстанциируется" в этом деструкторе - а там MyClass2 уже известен.
Что значит "инстанциируется" в деструкторе, т.е. в чём разница, деструктор по умолчанию это или объявленный мной? В обоих же случаях будет вызван деструктор QScopedPointer'а... Получается, что если деструктор по умолчанию, то тип, используемый в QScopedPointer'е - неизвестен (интересно почему).

Вообще расходы на изучение таких мелких классов часто превышают их usability Улыбающийся Еще один момент - затрудняется отладка - пока до тела доберешься...
так ведь дело не в изучении классов, а в понимании данного подхода.
62  Qt / Общие вопросы / Re: QScopedPointer forward declaration : Май 26, 2011, 22:47
Потому что в этом случае тип для скопед-поинтера (MyClass2) будет полностью определенным (в деструкторе скопед-поинтера находится что-то типа checked_delete).

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

Код структуры, которая чистит объект qscopedpointer'a:
Код
C++ (Qt)
template <typename T>
struct QScopedPointerDeleter
{
   static inline void cleanup(T *pointer)
   {
       // Enforce a complete type.
       // If you get a compile error here, read the secion on forward declared
       // classes in the QScopedPointer documentation.
       typedef char IsIncompleteType[ sizeof(T) ? 1 : -1 ];
       (void) sizeof(IsIncompleteType);
 
       delete pointer;
   }
};
 

Требует завершённый тип, даже в доку посылает, с этим понятно.
Но причём тут описание пустого деструктора парента-то? Чем конкретно это помогает? Интересен сам подход.
Получается, что если описано тело пустого деструктора класса, мембером которого является qscopedpointer, который, в свою очередь завязан с объектом при forward declaration, то этот qscopedpointer начинает понимать тип объекта, на который ссылается, как завершённый. Мистика.
63  Qt / Общие вопросы / Re: QScopedPointer forward declaration : Май 26, 2011, 22:36
Пусть лучше требует деструктор, чем ведёт себя как std::auto_ptr на некоторых компиляторах, который в таких случаях память освобождает, но деструктор не вызывает.
жестоко)
64  Qt / Общие вопросы / QScopedPointer forward declaration : Май 26, 2011, 20:42
Такой код:

myclass.h:
Код
C++ (Qt)
#ifndef MYCLASS_H
#define MYCLASS_H
 
#include <QScopedPointer>
 
class MyClass2;
 
class MyClass
{
public:
 MyClass();
 ~MyClass();
 QScopedPointer<MyClass2> _ptr;
 
};
 
#endif // MYCLASS_H
 

myclass.cpp:
Код
C++ (Qt)
#include "myclass.h"
#include "myclass2.h"
 
MyClass::MyClass()
{
this->_ptr.reset(new MyClass2);
}
 
MyClass::~MyClass() { }
 

myclass2.h:
Код
C++ (Qt)
#ifndef MYCLASS2_H
#define MYCLASS2_H
 
#include "myclass.h"
 
class MyClass2
{
public:
 MyClass2() { };
 ~MyClass2() { };
};
 
#endif // MYCLASS2_H
 

main.cpp:
Код
C++ (Qt)
#include "myclass.h"
 
int main(int argc, char *argv[])
{
MyClass obj;
}
 

Вопрос в том, зачем для MyClass'а, в котором мембером является QScopedPointer, при операции forward declaration необходимо обязательно объявлять деструктор, может кто-то выяснил это? Без деструктора бооольшой ерор. Думал может по умолчанию деструктор идёт как virtual (в доке по QScopedPointer такой какбэ запрещается), но если с ним, то всё ок. Не люблю такой подход - объявлять их пустыми, класс MyClass ведь никем не наследуется чтоб объявлять и виртуалить энтот деструктор...
65  Qt / Общие вопросы / Re: [решено] Удаление в слоте объекта его вызвавшего : Май 18, 2011, 14:03
чтобы можно было её выровнять по центру ячейки. По умолчанию она становится слева.
66  Qt / Общие вопросы / [решено] Удаление в слоте объекта его вызвавшего : Май 18, 2011, 13:53
добавил
Код
C++ (Qt)
delete btn->parent();
 
в слот удаления строки, помогло  Улыбающийся
Видимо, qtableview как-то по-своему чистит этот виджет.
67  Qt / Общие вопросы / Re: Удаление в слоте объекта его вызвавшего : Май 18, 2011, 12:58
Причём виджет с кнопкой (виджет, а в нём кнопка - это для того, чтоб её можно было выровнять по центру ячейки) создан в куче и неважно какого родителя ему ставить - вьюху или нет, всё равно segfault.
68  Qt / Общие вопросы / Re: Удаление в слоте объекта его вызвавшего : Май 18, 2011, 12:53
пробовал, не помогает. disconnect() для sender'а тоже. Проблема в том, что не я удаляю руками в коде кнопку, а qtableview это делает сама в тот момент когда обновляется модель. И проблема именно в кнопке, т.к. если прицепить слот к другой кнопке, которая не относится к qtableview, то всё ок, нужная строка затирается вместе с кнопкой удаления без проблем.
69  Qt / Общие вопросы / [решено] Удаление в слоте объекта его вызвавшего : Май 18, 2011, 12:48
Всем привет, вопрос в том, как удалить в слоте объект который его, этот слот, и вызвал. Собственно есть qtableview, в каждой строке которой есть кнопка удаления этой строки. По нажатию кнопки строка должна удалиться (на самом деле обновляется модель, но в которой уже отсутствует эта строка). На данный момент она не удаляется, зато есть segfault (кнопка видимо затирается раньше чем надо). Точнее он есть в версии Qt 4.7.3, а в 4.7.2 всё, как ни странно, ок (если юзать в слоте qmessagebox перед действием обновления модели) - поэтому баг обнаружил только при тестировании на более новой версии кьюта. Короче, идею надо переделать...
Метод добавления кнопки в каждый ряд вьюхи:
Код
C++ (Qt)
void MainWindow::addButtons()
{
QPushButton* btn(0);
QWidget* wt(0);
QHBoxLayout* ltH(0);
for (int i = 0; i < this->model.rowCount(); ++i)
{
 //delete button
 btn = new QPushButton("ok");
 btn->setFixedWidth(35);
 btn->setProperty("id", this->model.index(i, 0).data(0).toString());
 QObject::connect(btn, SIGNAL(pressed()), SLOT(deleteRow()));
 wt = new QWidget(&this->wtBase);
 ltH = new QHBoxLayout;
 ltH->setMargin(0);
 ltH->addWidget(btn, 0, Qt::AlignCenter);
 wt->setLayout(ltH);
 this->view.setIndexWidget(this->model.index(i, 2), wt);
};
}
 

Слот удаления строки (обновления модели):
Код
C++ (Qt)
void MainWindow::deleteRow()
{
QObject* btn = QObject::sender();
int _id = btn->property("id").toInt();
std::vector<Info>::iterator pos = std::find_if(this->vector.begin(), this->vector.end(),
                                               ValueEquals<int>(_id));
if (pos != this->vector.end())
 this->vector.erase(pos); // << - тут удаление нужной строки
this->updateTable(); //<< - тут метод обновления модели, нет смысла его показывать
}
 

Наглядный пример на всякий случай прикрепил.
70  Qt / Общие вопросы / Re: Segmentation fault : Май 16, 2011, 16:14
linux называется
Что "linux"? Подпись мою смотрел?)
71  Qt / Общие вопросы / Re: Segmentation fault : Май 16, 2011, 15:22
Подобную картину даёт проактивная защита в Comodo.
Это true. У меня на седьмой винде стоял comodo, так из-за него без полной пересборки программ был невозможен их runtime! Даже потоки вывода (std::cout) блочил и ничего не мог понять, пока не рискнул его снести нах. А выбрал только из-за бесплатности. До этого стоял avast, ничего подобного не наблюдалось, но достали бесконечные обновления ключей, их переактивации и т.п.

у меня аваст - всё норм
А не подскажешь где такой аваст взять, чтобы тихо-мирно жил и не дёргал по пустякам? Улыбающийся
72  Qt / Qt-инструментарий / Re: Медленная сборка в mingw под Win7 : Май 10, 2011, 23:33
причём здесь именно "-j4" вообще? Или у всех процы четырёхъядерные по определению? Это указывается количество процессов, а их кол-во для максимальной производительности процесса сборки должно соответствовать количеству ядер!
73  Разное / Объявления / Re: Ищем програмистов С++/QT4.7, javascripts, HTML, jquery для большого проекта : Май 10, 2011, 22:52
ЗП - это не детали, так что огласите пожалуйста Улыбающийся
74  Qt / Базы данных / Re: кодировки. почему работает? : Май 10, 2011, 00:34
Поле таблицы на русском? Круть, пока такого не встречал...
75  Qt / Qt Script, QtWebKit / Re: QWebView и позиция курсора : Май 06, 2011, 20:58
с помощью javascript, внедрённого в эту стриницу
Страниц: 1 ... 3 4 [5] 6 7 ... 43

Страница сгенерирована за 0.282 секунд. Запросов: 22.