crossplatform.ru

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


  Ответ в Наследование от QComboBox
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
AntonH851 Дата 24.3.2010, 10:57
  Самое интересное, что этот код работает если его использовать в простом виджете,
а в делегате не хочет работать...
AntonH851 Дата 24.3.2010, 10:05
 
Цитата(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
Litkevich Yuriy Дата 24.3.2010, 9:42
 
Цитата(AntonH851 @ 24.3.2010, 11:33) *
и опять ошибка..
какая ошибка?
AntonH851 Дата 24.3.2010, 9:16
  помогите пожалуста
AntonH851 Дата 24.3.2010, 8:33
 
Цитата(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;
}


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

Теперь проблема с этой строчкой
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, 16:27
 
Цитата(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:13
  Добрый день!

Написал наследника 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?
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 5.7.2025, 3:24