Просмотр сообщений
|
Страниц: 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 начинает понимать тип объекта, на который ссылается, как завершённый. Мистика.
|
|
|
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 ведь никем не наследуется чтоб объявлять и виртуалить энтот деструктор...
|
|
|
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(); //<< - тут метод обновления модели, нет смысла его показывать }
Наглядный пример на всякий случай прикрепил.
|
|
|
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" вообще? Или у всех процы четырёхъядерные по определению? Это указывается количество процессов, а их кол-во для максимальной производительности процесса сборки должно соответствовать количеству ядер!
|
|
|
|
|