crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Сброс выделения текста в редактируемом QComboBox
XXL
  опции профиля:
сообщение 22.12.2009, 0:29
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 30
Регистрация: 26.4.2009
Пользователь №: 708

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем доброй ночи!
Хочу задать маленький вопрос. Есть редактируемый QComboBox. Не могу понять, почему в его QLineEdit производится выделение текста. А именно отлавливаю сигнал изменения текста editTextChanged(const QString&). Получаю текущую позицию курсора, устанавливаю новый текст в текущую ячейку, а потом снова возвращаю курсор на полученную позицию:
void CWorkForm::OnEditTextChanged(const QString& strText)
{
    int pos = m_pComboBox->lineEdit()->cursorPosition();

    m_pComboBox->setItemText(iCurIndex, strText);

...............................................................

    m_pComboBox->lineEdit()->setCursorPosition(pos);
}


После этого в редактируемой строке выделяется кусок слова от последней позиции до pos...Также была испробована функция void QLineEdit::cursorBackward ( bool mark, int steps = 1 ) с mark = false и количеством шагов, равным количеству символов от конца слова до текущей позиции. Результат аналогичный...Почему такое может быть? А хотелось бы параллельно с редактированием слова редактировать ячейку без выделения текста...

Сообщение отредактировал XXL - 22.12.2009, 0:30
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.12.2009, 16:23
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(XXL @ 22.12.2009, 3:29) *
А хотелось бы параллельно с редактированием слова редактировать ячейку без выделения текста..
не понял про какую ячейку речь идёт.

вопрос, сходу: при вставке текста с помощью setItemText сигнал editTextChanged(const QString&) посылается повторно?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
XXL
  опции профиля:
сообщение 22.12.2009, 17:50
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 30
Регистрация: 26.4.2009
Пользователь №: 708

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ячейка - текущий комбобоксовский item для которого вызывается setItemText (нужно редактировать его параллельно с комбобоксовским QLineEdit - ввожу символ в QLineEdit, и сразу же соответственно меняю содержимое текущей ячейки).
Нет, сигнал повторно не посылается.
У меня проблема в том, если редактировать слово в QLineEdit где-то в середине, после setItemText курсор смещается на последнюю позицию. Я его хочу вернуть на место, чтобы в случае необходимости продолжить редактирование, а программное перемещение происходит с выделением текста, которого никак не удается избежать...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 23.12.2009, 9:57
Сообщение #4


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Можно ловить сигнал
void QLineEdit::selectionChanged ()   [signal]
и в обработчике делать
void QLineEdit::deselect ()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
XXL
  опции профиля:
сообщение 23.12.2009, 11:07
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 30
Регистрация: 26.4.2009
Пользователь №: 708

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(igor_bogomolov @ 23.12.2009, 9:57) *
Можно ловить сигнал
void QLineEdit::selectionChanged ()   [signal]
и в обработчике делать
void QLineEdit::deselect ()


Этот сигнал в данном случае не отлавливается, но обнаружилось когда происходит выделение текста.
Отлавливается сигнал
cursorPositionChanged ( int old, int new )

Предположим, есть слово - конечная позиция курсора 12. Перемещаем курсор на начало - в нулевую позицию (old-12, new-0) и вводим символ. pos = 1. После setItemText old = 0, new = 13. Если не вызывать функцию setCursorPosition(pos), больше в обработчик сигнала cursorPositionChanged не входим. Но если вызвать setCursorPosition(pos), то попадаем в этот обработчик еще 3 раза! Первый - соответственно дает old-13 new-1, а затем происходит что-то мне непонятное: old-1, new-13 и old-13, new-1. Это и дает выделение текста. Но почему?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 23.12.2009, 15:51
Сообщение #6


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(XXL @ 23.12.2009, 11:07) *
Этот сигнал в данном случае не отлавливается
Как это не отлавливается. Выделение есть, а сигнал не испускается ;)
main_test.cpp
#include <QtTest>
#include <QtDebug>
#include <QComboBox>
#include <QLineEdit>
#include <QGridLayout>

class MyClass : public QWidget
{
    Q_OBJECT
public:
    MyClass(QWidget * parent = 0)
        : QWidget(parent), pos(-1), comboBox(NULL)
    {
        comboBox = new QComboBox(this);
        comboBox->addItems(QStringList() << "test" << "string" << "qwerty");
        comboBox->setEditable(true);

        QGridLayout * layout = new QGridLayout(this);
        layout->addWidget(comboBox);

        connect(comboBox->lineEdit(), SIGNAL(textEdited(QString)), this, SLOT(OnEditTextChanged(QString)));
        // если закоментировать этот коннект, выделение сохранится
        connect(comboBox->lineEdit(), SIGNAL(selectionChanged()), this, SLOT(deselect()));
    }

    QComboBox * getComboBox() const
    {
        return comboBox;
    }

public slots:
    void OnEditTextChanged(const QString& strText)
    {
        if (!comboBox) return;
        pos = comboBox->lineEdit()->cursorPosition();
        comboBox->setItemText(comboBox->currentIndex(), strText);
        comboBox->lineEdit()->setCursorPosition(pos);
    }

    void deselect()
    {
        if(comboBox && pos!=-1) {
            comboBox->lineEdit()->deselect();
            pos = -1;
        }
    }

private:
    int pos;
    QComboBox * comboBox;
};


class Test_MyClass : public QObject
{
    Q_OBJECT
private slots:
    void testSelectText()
    {
        MyClass * test = new MyClass;
        test->resize(250,35);
        test->show();

        QTest::qWait(3000);
        QCoreApplication::processEvents();

        QComboBox * box = test->getComboBox();

        // хм... А вот здесь происходит выделение текста в lineEdit'e comboBox'a
        box->lineEdit()->setCursorPosition(1);
        QTest::keyClicks(box->lineEdit(), "e");
        QCOMPARE(box->lineEdit()->selectionStart(), -1);

        QTest::qWait(5000);
    }
};

QTEST_MAIN(Test_MyClass)
#include <main_test.moc>
.pro
TEMPLATE = app
CONFIG  += teambuilder qtestlib warn_on debug create_prl link_prl
SOURCES += main_test.cpp
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.12.2009, 16:16
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(igor_bogomolov @ 23.12.2009, 18:51) *
CONFIG += teambuilder
ты предлагаешь teambuilder поставить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 23.12.2009, 16:47
Сообщение #8


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(igor_bogomolov @ 23.12.2009, 15:51) *
CONFIG += teambuilder qtestlib warn_on debug create_prl link_prl
Я на самом деле понятия не имею что такое teambuilder, create_prl, link_prl. Этот конфиг у меня после общения с тех поддержной появился. Вот и пользуюсь. На самом деле их можно убрать, ничего не изменится.

Самому не понятно какого черта выделение появляется. Но проблему обойти указаным выше способом можно. Ну, и может кто сам захочет поэкспериментировать :)

Сообщение отредактировал igor_bogomolov - 23.12.2009, 16:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.12.2009, 17:05
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(igor_bogomolov @ 23.12.2009, 19:47) *
Я на самом деле понятия не имею что такое teambuilder
teambuilder - распределённая среда компиляции программ, работает только на *Nix'ах, тык

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
XXL
  опции профиля:
сообщение 23.12.2009, 17:27
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 30
Регистрация: 26.4.2009
Пользователь №: 708

Спасибо сказали: 0 раз(а)




Репутация:   0  


У меня не отлавливается сигнал выделения...Но только в случае этого конкретного выделения...В случае выделения текста пользователем- все в порядке-входим в соответствующий обаботчик!)
В итоге пока будет так (криво, конечно, но проблему решает):
...

m_pLineEdit = m_pComboBox->lineEdit();
...

void CWorkForm::OnTextChanged(const QString& strText)
{
    ...

    int pos = m_pLineEdit->cursorPosition();

    m_pComboBox->setItemText(m_iCurIndex, strText);

    connect(m_pLineEdit, SIGNAL(cursorPositionChanged(int, int)), this, SLOT(OnPosChanged()));
    
    m_pLineEdit->setCursorPosition(pos);
}

void CWorkForm::OnPosChanged()
{
    bool bSel = m_pLineEdit->hasSelectedText();
    if (!bSel)
        return;

    m_pLineEdit->deselect();

    disconnect(m_pLineEdit, SIGNAL(cursorPositionChanged(int, int)), this, SLOT(OnPosChanged()));
}


Это позволяет сбросить ненужное выделение, но в то же время позволяет пользователю выделять текст, сбрасывать выделение и как угодно редактировать текст). Кстати, при сбросе выделения m_pLineEdit->deselect(); соответствующий сигнал изменения выделения отлаливается) Но с этим я еще разберусь)

Спасибо вам большое!)

Сообщение отредактировал XXL - 23.12.2009, 17:38
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.4.2024, 1:57