crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Наследование от QComboBox
AntonH851
  опции профиля:
сообщение 23.3.2010, 16:13
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 20.2.2010
Из: Шебекино
Пользователь №: 1475

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




Репутация:   0  


Добрый день!

Написал наследника QComboBox

class SqlComboBox : public QComboBox
{
    Q_OBJECT

public:
    SqlComboBox(QWidget *parent = 0);
    bool checkComboText();

    int column;

signals:
    void insertItemSignal(QString text);
    void editingFinished();

protected:
    void keyPressEvent(QKeyEvent *e);

};

SqlComboBox::SqlComboBox(QWidget *parent)
    : QComboBox(parent)
{

}

void SqlComboBox::keyPressEvent(QKeyEvent *e)
{
    if (e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) {
        if (this->checkComboText())
            emit editingFinished();
    } else
        QComboBox::keyPressEvent(e);
}

bool SqlComboBox::checkComboText()
{
    if (!lineEdit()->text().isEmpty()) {
        const int index =
                findText(lineEdit()->text(), Qt::MatchFlags());
        if (index == -1) {
            const int answer =
                    QMessageBox::question(this, "Новый элемент",
                                          "Добавить \"" +
                                          lineEdit()->text() +
                                          "\" в список?",
                                          QMessageBox::Yes | QMessageBox::No);
            if (answer == QMessageBox::Yes)
            {
                emit insertItemSignal(lineEdit()->text());
            }
            this->lineEdit()->setFocus();
            this->lineEdit()->selectAll();
            return false;
        } else {
            return true;
        }
    } else
        return false;

    return false;
}


в методе checkComboText на строчке
 if (!lineEdit()->text().isEmpty()) {

вылетает ошибка


причем подобный метод у меня есть в похожем компоненте, где он без проблем работает....
в чем тут может быть проблема, ума не приложу.... Помогите пожалуйста, если кто знает что не так.....


Как я понимаю указатель на lineEdit пустой... а вот почему он пустой?


В каких случаях он будет возвращать корректный указатель на lineEdit?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.3.2010, 16:27
Сообщение #2


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

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

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




Репутация:   94  


Цитата(AntonH851 @ 23.3.2010, 19:13) *
Как я понимаю указатель на lineEdit пустой... а вот почему он пустой?
В каких случаях он будет возвращать корректный указатель на lineEdit?
Однако в асистенте написано:
Цитата
QLineEdit * QComboBox::lineEdit () const
Returns the line edit used to edit items in the combobox, or 0 if there is no line edit.

Only editable combo boxes have a line edit.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AntonH851
  опции профиля:
сообщение 23.3.2010, 16:49
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 20.2.2010
Из: Шебекино
Пользователь №: 1475

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




Репутация:   0  


С этим разобрался. Спасибо!

Теперь проблема с этой строчкой
const int answer =
                    QMessageBox::question(this, "Новый элемент",
                                          "Добавить \"" +
                                          lineEdit()->text() +
                                          "\" в список?",
                                          QMessageBox::Yes | QMessageBox::No);


Причем отладчик сначала останавливается в файле qlist.h на этом месте:

Q_OUTOFLINE_TEMPLATE QList<T>::~QList()
{
    if (d && !d->ref.deref())
        free(d);
}


а если продолжить отладку то в файле qmessagebox.cpp

QAbstractButton *QMessageBox::clickedButton() const
{
    Q_D(const QMessageBox);
    return d->clickedButton;
}


Самое интересное, что ошибка вылетает не сразу при показе меседжа, а через небольшой промежуток времени....

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.3.2010, 20:31
Сообщение #4


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

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

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




Репутация:   94  


Цитата(AntonH851 @ 23.3.2010, 19:49) *
Теперь проблема с этой строчкой
что за проблема-то?
если ты говоришь разобрался. Под разобрался я понимаю, что ты исправил начало своей функции, на такое:
bool SqlComboBox::checkComboText()
{
    if (!lineEdit()){
        return false;
    }
}
И ещё я бы для простоты сразу бы текст получил:
QString text = lineEdit()->text();
и далее эту переменную пользовал
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AntonH851
  опции профиля:
сообщение 24.3.2010, 8:33
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 20.2.2010
Из: Шебекино
Пользователь №: 1475

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 23.3.2010, 20:31) *
Цитата(AntonH851 @ 23.3.2010, 19:49) *
Теперь проблема с этой строчкой
что за проблема-то?
если ты говоришь разобрался. Под разобрался я понимаю, что ты исправил начало своей функции, на такое:
bool SqlComboBox::checkComboText()
{
    if (!lineEdit()){
        return false;
    }
}
И ещё я бы для простоты сразу бы текст получил:
QString text = lineEdit()->text();
и далее эту переменную пользовал


я так и сделал...
оказывается не надо было для QMessageBox родителя указывать, заменил на 0...
и опять ошибка...
теперь уже при испускании сигнала...
if (answer == QMessageBox::Yes)
            {
                emit insertItemSignal(text);
            }

хотя он у меня соединен со слотом...

QWidget* GTDComboDelegate::createEditor(QWidget *parent,
                                        const QStyleOptionViewItem &option,
                                        const QModelIndex &index) const
{
    SqlComboBox *box = new SqlComboBox(parent);

    connect(box, SIGNAL(insertItemSignal(QString)),
            this, SLOT(insertItemSlot(QString)));
    connect(box, SIGNAL(editingFinished()),
            this, SLOT(commitAndCloseEditor()));

    return box;
}


что опять не так(?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AntonH851
  опции профиля:
сообщение 24.3.2010, 9:16
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 20.2.2010
Из: Шебекино
Пользователь №: 1475

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




Репутация:   0  


помогите пожалуста
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 24.3.2010, 9:42
Сообщение #7


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

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

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




Репутация:   94  


Цитата(AntonH851 @ 24.3.2010, 11:33) *
и опять ошибка..
какая ошибка?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AntonH851
  опции профиля:
сообщение 24.3.2010, 10:05
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 20.2.2010
Из: Шебекино
Пользователь №: 1475

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 24.3.2010, 9:42) *
Цитата(AntonH851 @ 24.3.2010, 11:33) *
и опять ошибка..
какая ошибка?




вот в этом месте файла qobject_p.h
inline bool QObjectPrivate::isSignalConnected(uint signal_index) const
{
    return signal_index >= sizeof(connectedSignals) * 8
        || qt_signal_spy_callback_set.signal_begin_callback
        || qt_signal_spy_callback_set.signal_end_callback
        || (connectedSignals[signal_index >> 5] & (1 << (signal_index & 0x1f)));
}


ошибка возникает при попытке выполнить emit insertItemSignal(text);

и почему то в консоли приложения выдает вот это:
Object::connect: No such signal SqlComboBox::insertItemSignal(QString) in MainWindowDelegates\gtdcombodelegate.cpp:35



Цитата(AntonH851 @ 24.3.2010, 9:54) *
и почему то в консоли приложения выдает вот это:
Object::connect: No such signal SqlComboBox::insertItemSignal(QString) in MainWindowDelegates\gtdcombodelegate.cpp:35


ой нет, это понятно...

вот еще что выдает
Lowest section in C:\WINDOWS\system32\odbcint.dll is .rsrc at 1f841000
Lowest section in C:\WINDOWS\system32\xpsp2res.dll is .rsrc at 00011000
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AntonH851
  опции профиля:
сообщение 24.3.2010, 10:57
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 20.2.2010
Из: Шебекино
Пользователь №: 1475

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




Репутация:   0  


Самое интересное, что этот код работает если его использовать в простом виджете,
а в делегате не хочет работать...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 18.4.2024, 9:31