29 августа 2006

QThread

Нигде толком не описано поведение этого класса при выходе из функции QThread::run(). Оказывается, после выхода из этой функции вызывается деструстор класса! Причём QThread::setTerminationEnabled(bool) на это поведение не влияет. Проверено на Qt4.1.4.

25 августа 2006

PCH

Если вы используете компилятор который поддерживает precompiled headers, то используйте это сойство во благо себе. Так мне сегодня удалось поднять скорость сборки одной программы с двух с половиной минут до 50 секунд! Причём так как программа находится в стадии активной разработки, в файл pch.h я включил только заголовки от Qt.

24 августа 2006

QTabWidget::setCornerWidget()

Ещё одно странное певедение в Qt4.1.4.
Предположим, что есть экземпляр QMainWindow и в нём следующий код:

m_twWindows = new QTabWidget(this);
QToolButton *tb = new QToolButton(m_twWindows);
tb->setDefaultAction(new QAction(QIcon(":icons/close.png"), trUtf8("Закрыть"), this)); //!!!
m_twWindows->setCornerWidget(tb, Qt::TopRightCorner);
setCentralWidget(m_twWindows);
m_twWindows->setTabPosition(QTabWidget::North);

Так вот, если строки инициализации и настройки QToolButton перенести после setCentralWidget, то кнопка не появится! Правда есть обход этой ситуации. Центральным виджетом сделать экземпляр QWidget и на него положить m_twWindows, то порядок строк не имеет значения. Вот так вот...

22 августа 2006

Странное поведение QFormBuilder

В версии QT4.1.4 наткнулся на следующий глюк. Если в начале ui файла добавить стандартный XML заголовок:
<?xml version="1.0" encoding="UTF-8"?>
и попытаться загрузить его с помощью QFormBuilder или QUiLoader (который пользуется первым внутри себя) , то форма не будет создана. Метод load() вернёт 0. Аналогично и при попытке загрузить изменённый таким образом файл в дизайнер ничего хорошего вы не увидите. Вернее он скажет так:
QT4.2 snapshot-20060816 ведёт себя так же. Баг этот я запостил в троллевский багтрекер, номер вроде присвоили #126689, но пока я его там не нахожу.

11 августа 2006

Отладка QSqlTableModel

Если при отладке программы использующей QSqlTableModel вам необходимо видеть SQL запросы которые она генерирует используйте сигналы

void QSqlTableModel::beforeDelete ( int row )
void QSqlTableModel::beforeInsert ( QSqlRecord & record )
void QSqlTableModel::beforeUpdate ( int row, QSqlRecord & record )

Например так

...
void AbstractDirectory::beforeInsert(QSqlRecord &rec) {
QSqlDriver *driver = QSqlDatabase::database().driver();
bool prepStatement = driver->hasFeature(QSqlDriver::PreparedQueries);
QString stmt = driver->sqlStatement(QSqlDriver::InsertStatement, _itemTableName, rec, prepStatement);
qDebug << stmt;
}
...