Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Наследование от QComboBox
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
AntonH851
Добрый день!

Написал наследника 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
Цитата(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
С этим разобрался. Спасибо!

Теперь проблема с этой строчкой
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
Цитата(AntonH851 @ 23.3.2010, 19:49) *
Теперь проблема с этой строчкой
что за проблема-то?
если ты говоришь разобрался. Под разобрался я понимаю, что ты исправил начало своей функции, на такое:
bool SqlComboBox::checkComboText()
{
    if (!lineEdit()){
        return false;
    }
}
И ещё я бы для простоты сразу бы текст получил:
QString text = lineEdit()->text();
и далее эту переменную пользовал
AntonH851
Цитата(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
помогите пожалуста
Litkevich Yuriy
Цитата(AntonH851 @ 24.3.2010, 11:33) *
и опять ошибка..
какая ошибка?
AntonH851
Цитата(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
Самое интересное, что этот код работает если его использовать в простом виджете,
а в делегате не хочет работать...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.