вторник, 28 августа 2012 г.

sudo/kdesudo перестает работать для gui из-за правил в sudoers

При добавлении строки
Defaults        env_keep="HOME USER PATH http_proxy https_proxy"
в файл /etc/sudoers перестает работать gui через sudo. Например, sudo partitionmanager или kdesudo partitionmanager.

воскресенье, 15 июля 2012 г.

Настройка proxy для sudo

Для того чтобы команда sudo подхватывало переменные окружения вида http_proxy, необходимо в файле /etc/sudoers добавить строку Defaults env_keep="HOME USER PATH http_proxy https_proxy"

вторник, 3 июля 2012 г.

Настройка cdt eclipse

Для того, чтобы заработал context assist с библиотекой qt необходимо в настройках проекта включить ВСЕ пути к заголовочным файлам qt и запустить indexer -> rebuild.

Если не работает просмотр в плагине свн, нужно посмотреть свойства проекта, а именно корневой путь к свн. Если путь не существует или некорректный, то поправить его можно следующим образом: закрываем все проекты, связанные с этим путем, из перспективы svn пытаемся удаляем его, открываем проекты.

вторник, 26 июня 2012 г.

subversion 1.7 в kubuntu 12.04 (precise)

Для установки subversion 1.7 в kubuntu 12.04 (precise) необходимо добавить в файл /etc/apt/sources.list строку
deb http://ppa.launchpad.net/dominik-stadler/subversion-1.7/ubuntu precise main

Далее выполнить установку или обновление пакета subversion

sudo aptitude update
sudo aptitude install subversion (sudo aptitude safe-upgrade)

вторник, 19 июня 2012 г.

Заморозка GUI в Qt

Для решения проблем заморозки GUI и реализации отзывчивых приложений необходимо придерживаться советов из следующих статей:
http://doc.qt.nokia.com/qq/qq27-responsive-guis.html
http://qt-project.org/wiki/Progress-bar

Класс для выполнения длительных операций в отдельном потоке с выводом QProgressBar:

file.h



typedef boost::function< void () > BusyFunction;

class Busy : public QObject
{
    Q_OBJECT

public:

    Busy( const QString& label
          , const BusyFunction& longOperationFunction
          , QWidget* parentWidget );
 
private:
 
    void start();
 
private:

    CONST_PROPERTY( QPointer< QFutureWatcher< void > >
                    , watcher );
 
    CONST_PROPERTY( QPointer< QProgressDialog >, progress );

    CONST_PROPERTY( BusyFunction, longOperationFunction );
};


file.cpp


Busy::Busy( const QString& label
            , const BusyFunction& longOperationFunction
            , QWidget* parentWidget )
    : QObject()
      , INIT_PROPERTY( watcher, new QFutureWatcher< void >( this ) )
      , INIT_PROPERTY( progress
                       , new QProgressDialog( label, QString(), 0, 0
                                              , parentWidget ) )
      , INIT_PROPERTY( longOperationFunction, longOperationFunction )
{
    this->progress()->setWindowFlags( Qt::Tool | Qt::CustomizeWindowHint
                                          | Qt::WindowTitleHint );
 
    this->progress()->setWindowModality( Qt::WindowModal );

    this->progress()->setCancelButton( 0 );

    connect( this->watcher(), SIGNAL( finished() )
             , this->progress(), SLOT( cancel() ) );

    this->start();
}

void Busy::start()
{
    QFuture< void > future = QtConcurrent::run( this->longOperationFunction() );

    this->watcher()->setFuture( future );

    this->progress()->exec();
}


preocessEvents из дополнительного потока Qt

В qt нельзя вызвать processEvents из другого (не gui) потока. При создании потока и связи сигнала этого потока со слотом главного потока посредством connect через Qt::DirectConnection, слот будет выполняться в дополнительном потоке. Проверить принадлежность к потоку можно вызовом QThread::currentThread(). В связи с этим вызов метода QApplication::processEvents() из слота не предпримет никаких действий, т.к. для дополнительного потока очередь gui событий будет пуста. (QApplication::hasPendingEvents() вернет false).

понедельник, 4 июня 2012 г.

Хранение GUI настроек окна в Qt4

В виду особенностей X11 не рекомендуется для хранения геометрии окна использовать метод QWidget::geometry() и восстанавливать методом QWidget::setGeometry(). Вместо этого нужно использовать QRect( QWidget::pos(), QWidget::size() ) и восстанавливать через QWidget::move() и QWidget::resize();

links:
http://qt-project.org/doc/qt-4.8/application-windows.html
http://qt-project.org/doc/qt-4.8/qsettings.html