LINUX.ORG.RU

QDialog


0

0

Привет. Решил освоить Qt и тут же столкнулся с проблемой. Хочу сделать простой диалог у которого есть 2 QLineEdit и одна кнопка. По нажатию на кнопку, то что находится этих QLineEdit'ах хочу записать в строку. Я взял QtDesigner нарисовал там форму, даже получил хедар. А вот как свой код писать и главное куда не понимаю!

Зарание извиняюс за тупой вопрос! Спасибо

anonymous

не конифоль себе голову этими дезайнерами. пиши код сам тк дольше будешь менюшки в дизайнере счелкать

Sancho_s_rancho
()
Ответ на: комментарий от Sancho_s_rancho

> не конифоль себе голову этими дезайнерами. пиши код сам тк дольше будешь менюшки в дизайнере счелкать

Ты что, дейсвительно так считаешь? :-)

По теме: читайте руководство, там же все написано!

smh ★★★
()
Ответ на: комментарий от smh

ну и я так считаю :)

На самом деле, ещё в Qt3 код генереный uic'ом был далёк от совершенства. Скорость выполнения кода могла упасть, т.к. там была аццки неоптимизированная реализация конструктора, где и создавались все виджеты. В Qt4 ситуация не намного лучше =) Маленькие формы типа сабжа лучше делать руками, особенно по первому разу.

Дизайнер стоит применять только в тяжёлых случаях, да и то в продакшн версии я бы исключил все .ui-шки из проекта, а включил бы их .cpp реализации, подредактировав ручками по ходу.

alex_custov ★★★★★
()
Ответ на: комментарий от Legioner

Для вас, латентных, чтоб не плакали, что в студии есть, а в qt нет.

anonymous
()
Ответ на: комментарий от alex_custov

> Скорость выполнения кода могла упасть, т.к. там была аццки неоптимизированная реализация конструктора

А можно было бы пример оптимизированного конструктора и неоптимизированного (uic), в результате дающего форму достаточно сложной структуры?

smh ★★★
()
Ответ на: комментарий от smh

    tableIgnore = new QTable( WStackPage_3, "tableIgnore" );
    tableIgnore->setNumCols( tableIgnore->numCols() + 1 );
    tableIgnore->horizontalHeader()->setLabel( tableIgnore->numCols() - 1, tr2i18n( ".." ) );
    tableIgnore->setNumCols( tableIgnore->numCols() + 1 );
    tableIgnore->horizontalHeader()->setLabel( tableIgnore->numCols() - 1, tr2i18n( "protocol" ) );
    tableIgnore->setNumCols( tableIgnore->numCols() + 1 );
    tableIgnore->horizontalHeader()->setLabel( tableIgnore->numCols() - 1, tr2i18n( "service" ) );
    tableIgnore->setNumCols( tableIgnore->numCols() + 1 );
    tableIgnore->horizontalHeader()->setLabel( tableIgnore->numCols() - 1, tr2i18n( "user" ) );
    tableIgnore->setNumCols( tableIgnore->numCols() + 1 );
    tableIgnore->horizontalHeader()->setLabel( tableIgnore->numCols() - 1, tr2i18n( "program" ) );
    tableIgnore->setNumCols( tableIgnore->numCols() + 1 );
    tableIgnore->horizontalHeader()->setLabel( tableIgnore->numCols() - 1, tr2i18n( "local IP" ) );
    tableIgnore->setNumCols( tableIgnore->numCols() + 1 );
    tableIgnore->horizontalHeader()->setLabel( tableIgnore->numCols() - 1, tr2i18n( "local port" ) );
    tableIgnore->setNumCols( tableIgnore->numCols() + 1 );
    tableIgnore->horizontalHeader()->setLabel( tableIgnore->numCols() - 1, tr2i18n( "remote IP" ) );
    tableIgnore->setNumCols( tableIgnore->numCols() + 1 );
    tableIgnore->horizontalHeader()->setLabel( tableIgnore->numCols() - 1, tr2i18n( "remote port" ) );
    tableIgnore->setFrameShape( QTable::NoFrame );
    tableIgnore->setNumRows( 0 );
    tableIgnore->setNumCols( 9 );
    tableIgnore->setSelectionMode( QTable::SingleRow );                                                                                                     

...

1) ВСЕ вызовы tableIgnore->setNumCols( tableIgnore->numCols() + 1 ); можно удалять. 
2) horizontalHeader() не inline метод
3) numCols()  не inline метод
4) Всё это касается и заполнения таблицы строками. Когда вместо 1 вызова, uic создаёт 4.

К тому же все формы из дизайнера переводятся фактически два раза: один раз при создании каждого элемента, второй раз в конце конструктора:

    languageChange();                                                                                                                                       

alex_custov ★★★★★
()
Ответ на: комментарий от Legioner

>>А зачем тогда вообще этот дизайнер делали?

Для удобства. Тут дело не в дизайнере, а в калечности uic'a.

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

Хорошо. Убедили :-) Но все-таки, как верно замечено, дизайнер тут не причем.

smh ★★★
()
Ответ на: комментарий от alex_custov

Понятно.

Просто ради интереса, на сколько по времени выигрывает ручная «оптимизация»? Я тут на джаве уже совсем ленюсь оптимизировать без профайлинга, мне почему-то кажется, что пару миллисекунд это очень пессимистичная оценка. Там же от силы пара десятков очень лёгких методов, setNumCols скорее всего память перераспределит раза три, как то неубедительно.

Про не-inline методы совсем не понял. По вашему getter-ы может хоть как то тормозить? Лень смотреть, если они не виртуальные, компилятор их встроит с очень большой вероятностью. Если виртуальные, тут немного хуже, но в сущности после первого вызова всё нужное будет в кеше, и остальные вызовы будут практически бесплатные.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

>>setNumCols скорее всего память перераспределит раза три

В данном случае он вызывается 10(!!) раз вместо одного. Вот кстати его реализация, доволно громоздкая не только с точки зрения памяти но и времени:

******************************

void QTable::setNumCols( int c )
{
    if ( c < 0 )
        return;

    if (c < numCols()) {
        // Removed columns are no longer hidden, and should thus be removed from "hiddenCols"
        for (int cc = numCols()-1; cc >= c; --cc) {
            if (d->hiddenCols.find(cc))
                d->hiddenCols.remove(cc);
        }
    }

    QPtrVector<QTableItem> tmp;
    QPtrVector<TableWidget> tmp2;
    saveContents( tmp, tmp2 );

    bool isUpdatesEnabled = topHeader->isUpdatesEnabled();
    topHeader->setUpdatesEnabled( FALSE );

    bool updateBefore;
    updateHeaderAndResizeContents( topHeader, numCols(), c, 100, updateBefore );

    restoreContents( tmp, tmp2 );

    topHeader->calculatePositions();
    finishContentsResze( updateBefore );
    topHeader->setUpdatesEnabled( isUpdatesEnabled );

    if ( isUpdatesEnabled )
        topHeader->update();

    topHeader->updateCache();

    if ( curCol >= numCols() ) {
        curCol = numCols() - 1;
        if ( curCol < 0 )
            curRow = -1;
        else
            repaintCell( curRow, curCol );
    }
}

******************************

И это вызывается 10 раз подряд.

>>компилятор их встроит с очень большой вероятностью

зачем компилятору встраивать не-inline методы ? :)

В данном случае метод numCols() вызывается 18 раз, хотя мог бы вызваться 1 раз. Если бы он был inline - ну и бог с ним, а так...

alex_custov ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.