Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
алексей_26_рус
-1 / 0 / 0
Регистрация: 12.05.2012
Сообщений: 14
#1

Вставить в TableWidget комбобоксы - C++ Qt

23.05.2012, 20:33. Просмотров 1841. Ответов 16
Метки нет (Все метки)

хочу в Qt в ячейки TableWidget'а вставить комбо боксы, чтобы при заполнении таблицы (6 столбцов), можно было выбирать уже фиксированные значения (во втором и третьем столбце не надо). не могу сообразить как это сделать, если это вообще возможно, то подскажите пожалуйста как.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2012, 20:33
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вставить в TableWidget комбобоксы (C++ Qt):

TableWidget
Добрый вечер! Уравнение вынужденных колебаний маятника решается методом...

TableWidget
Не получается загрузить текстовый файл в таблицу, подскажите пожалуйста или...

CheckBox и TableWidget
Привет всем! Как выровнять по центру checkbox внутри ячейки. ...

Копирование строк из tableWidget ?
Добрый день, подскажите как можно реализовать, копирование отмеченных строк с...

Выбор элемента в tableWidget
Помогите пожалуйста!!! Нужно выбрать элемент матрицы в tableWidget и при выборе...

KeyPress для TableWidget
Доброго времени суток. Подскажите, как организовать проверку ввода в...

16
Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
24.05.2012, 10:55 #2
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <QtGui>
#include <QtSql>
 
#include "UserTypeDelegate.h"
 
//! [0]
UserTypeDelegate::UserTypeDelegate(QObject *parent)
    : QStyledItemDelegate(parent)
{
}
//! [0]
 
//! [1]
QWidget *UserTypeDelegate::createEditor(QWidget *parent,
                                     const QStyleOptionViewItem & /* option */,
                                     const QModelIndex &index) const
{
    if (index.column() == 1) {
        QComboBox *comboBox = new QComboBox(parent);
        QSqlQuery query;
        query.prepare("SELECT `type_description` FROM `phones_type_reference`;");
        if(!query.exec()){
            qDebug("opa-pa");
        } else {
            QSqlRecord rec = query.record();
            while(query.next()){
                comboBox->addItem(tr(query.value(rec.indexOf("type_description")).toString().toAscii().data()));
            }
        }
        connect(comboBox, SIGNAL(activated(int)), this, SLOT(emitCommitData()));
 
        return comboBox;
    } else {
        QLineEdit* qle = new QLineEdit(parent);
        //connect(qle, SIGNAL(catchFocus()), this,SLOT(qlineFocus()));
        qle->setStyleSheet(qle->styleSheet()+"QLineEdit{background-color: white;}" );
        connect(qle, SIGNAL(editingFinished()), this, SLOT(emitCommitData()));
        return qle;
    }
}
 
//! [1]
 
//! [2]
void UserTypeDelegate::setEditorData(QWidget *editor,
                                  const QModelIndex &index) const
{
    QComboBox *comboBox = qobject_cast<QComboBox *>(editor);
    if (!comboBox){
    } else  {
        int pos = comboBox->findText(index.model()->data(index).toString(), Qt::MatchExactly);
        comboBox->setCurrentIndex(pos);
    }
    QLineEdit *line = qobject_cast<QLineEdit *>(editor);
    if (!line){
    } else  {
        line->setText(index.model()->data(index).toString());
    }
 
}
//! [2]
 
//! [3]
void UserTypeDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                 const QModelIndex &index) const
{
    QComboBox *comboBox = qobject_cast<QComboBox *>(editor);
    if (!comboBox){
    } else  {
        model->setData(index, comboBox->currentText());
    }
    QLineEdit *line = qobject_cast<QLineEdit *>(editor);
    if (!line){
    } else  {
        model->setData(index, line->text());
    }
}
//! [3]
 
//! [4]
void UserTypeDelegate::emitCommitData()
{
    emit commitData(qobject_cast<QWidget *>(sender()));
}
//! [4]

C++ (Qt)
1
2
    UserTypeDelegate* pd = new UserTypeDelegate(this);
    (QTableWidget)->setItemDelegate(pd);
0
алексей_26_рус
-1 / 0 / 0
Регистрация: 12.05.2012
Сообщений: 14
24.05.2012, 16:15  [ТС] #3
ломаю голову как вставить в ячейки tablewidget'а комбо боксы, чтобы создать раскрывающийся список фиксированных значений. tablewidget состоит из 6 столбцов, в 1,4,5,6 необходимо сделать фиксированные списки. если это возможно, подскажите как (или хотя бы во все столбцы)
0
Maxim Prishchepa
Эксперт С++
1924 / 1036 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
24.05.2012, 16:27 #4
создаёте делегата и делаете setDelegateForColumn() на 1,4,5,6 столбцы и вот оно счастье - подробнее о делегатах читайте в ассистенте или пользуйтесь поиском

Добавлено через 3 минуты
а ещё лучше смотрите, что Вам ответили в Вашей предыдущей теме... и не стоит плодить одинаковые темы!
0
алексей_26_рус
-1 / 0 / 0
Регистрация: 12.05.2012
Сообщений: 14
24.05.2012, 17:15  [ТС] #5
Drus, А ЕСЛИ У МЕНЯ КАК ОСНОВНОЙ (*parent) забит tablewidget, то как под него делегата?
0
Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
24.05.2012, 17:21 #6
напишите в чем ваша трудность
C++ (Qt)
1
enum{НЕПОНИМАТЬ/НЕУМЕТЬГУГЛИТЬ/ВЗЯЛСЯНЕПОСИЛАМ/ДУГОЙВАРИАНТ}problem;
Пишите что не получается и вам помогут, код выкладывайте с успехами будем смотреть

Добавлено через 4 минуты
Ну тогда просто можете ничего не передавать, это наверно первое что приходит на ум. указатель на родителя в данном месте не обязательная штука, для моих целей он был нужен
0
алексей_26_рус
-1 / 0 / 0
Регистрация: 12.05.2012
Сообщений: 14
24.05.2012, 17:35  [ТС] #7
Drus, моя проблема в том что я в программировании НОВИЧОК, знаю только примитив, при написании диплома понадобилась разработка программы и я пытаюсь освоить более серьезные функции, что-то понимаю, что-то нет.

пытаюсь в заголовочном файле прописать UserTypeDelegate как класс, но компилятор выдает что он не продекларирован
0
Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
24.05.2012, 17:45 #8
там должна быть 2-я часть у того что я написал именуемая "заголовком" тобиш ****.h
то что я вам написал - это файл исходников *.cpp

Вам задали написать такое на с++ ?
Сам язык как знаете? если только со словарем - я бы не советовал сразу в Qt лезть, там куда не плюнь стандартными средствами не справиться, нужно наследоваться


C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#ifndef USERTYPEDELEGATE_H
#define USERTYPEDELEGATE_H
 
#include <QStyledItemDelegate>
#include "custdialog.h"
 
//! [0]
class UserTypeDelegate : public QStyledItemDelegate
{
    Q_OBJECT
 
public:
    UserTypeDelegate(QObject *parent = 0);
//! [0]
 
//! [1]
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const;
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model,
                      const QModelIndex &index) const;
 
//! [1] //! [2]
private slots:
    void emitCommitData();
};
//! [2]
 
#endif

Чет я не увидел целиком ваше сообщение=) прошу прощения за совсем нуборазьснение =)
0
алексей_26_рус
-1 / 0 / 0
Регистрация: 12.05.2012
Сообщений: 14
24.05.2012, 17:50  [ТС] #9
нет задали в Qt
то есть мне вот это
Цитата Сообщение от Drus Посмотреть сообщение
Код C++ (QT)
1
2
3
UserTypeDelegate* pd = new UserTypeDelegate(this);
(QTableWidget)->setItemDelegate(pd)
надо в заголовочном прописать?
0
Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
24.05.2012, 18:00 #10
Цитата Сообщение от алексей_26_рус Посмотреть сообщение
нет задали в Qt
то есть мне вот это

надо в заголовочном прописать?
Неа, заголовочный файл я вам выложил. то что вы процитировали - уже использование класса.

Вам сейчас необходимо правой клавишей на проекте нажать => создать новый класс => выбрать пункт "наследовать от QWidget" и запихнуть туда коды с двух разных файлов выложенных в теме, каждый код в свой файл (*.h *.cpp) затем в файле main подключить заголовочный файл делегата

#include "deligate.h"

и использовать его по назначению, как вы описали выше


Поверьте что подробнее вам навряд ли кто-то напишет, максимум неточности поправят. Если не получится - ищите, гуглите, пробуйте снова. На мой взгляд вы рано полезли в дебри, ну или пока еще мало прочитали литературы
0
алексей_26_рус
-1 / 0 / 0
Регистрация: 12.05.2012
Сообщений: 14
24.05.2012, 20:53  [ТС] #11
Drus, при компиляции вылетает

D:/qt_project/DIPLOM/main.cpp:3: deligate.h: No such file or directory

и еще четыре оповещения. попробовал заменить на

#include "UserTypeDelegate.h"

выбивает подобное сообщение с "custdialog.h"
прерыл весь корень Qt и не нашел их, какой каталог он требует и где его найти
0
Maxim Prishchepa
Эксперт С++
1924 / 1036 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
24.05.2012, 21:25 #12
это полный пи... вам реально дешевле будет купить диплом, вы в программировании полный 0!!!!
опишите чо хоть сделать нужно (целиком)?
0
алексей_26_рус
-1 / 0 / 0
Регистрация: 12.05.2012
Сообщений: 14
24.05.2012, 22:24  [ТС] #13
Drus, сделал как вы говорили, но при компиляции выдает оповещеня игнорированя:
D:/qt_project/DIPLOM/Makefile.Debug:109: warning: ignoring old commands for target `debug/moc_UserTypeDelegate.cpp'
еще вот такие:
D:/qt_project/DIPLOM/Makefile.Debug:165: warning: overriding commands for target `debug/moc_UserTypeDelegate.o'
и говорит, что нет файла или каталога QtSql, я уже в программном коде прописывал путь к QtSql, не помогло

Добавлено через 8 минут
l_a_m, надо написать программу, для редактирования файла, в которм хранятся параметры аутентификации.
интерфейс выглядит так
нужно, чтобы в ячейках были выпадающие списки на русском языке, а при сохранении файла русские записи интерпритировались бы в вид понятный программе использующий этот файл
0
Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
25.05.2012, 07:30 #14
почему вы учебник по с++ в руки так и не взяли? мне это не понятно. Qt это не какая-то надстройка над с++, позволяющая от оного полностью освободиться. про #include ответ написан едва ли не на первой странице после введения.

Давайте обратимся к гуглу с запросом "#include c++" и получим исчерпывающий ответ, но чтобы сэкономить ваше время:

этой директивой вы подключаете заголовочный файл deligate.h.

если вы написали #include "deligate.h" то поиск осуществляется в папке где расположен файл main.cpp

Теперь логичный вопрос: А этот файл там есть?

На вопрос что он должен содержать:
Он должен содержать в вашем случае описание класса(заголовочный файл), а именно "сlass UserTypeDelegate : ..."


вот эта штука #include "custdialog.h" вообще вам не нужна, не заметил
что это такое? ну ели вы уже разобрались - то это очередной заголовочный файл, содержащий описание класса, мы его не пользуем, так что он и не нужен.

C++ (Qt)
1
UserTypeDelegate : public QStyledItemDelegate
это наследование, его вы должны знать лучше таблицы умножения, да там и учить то нечего

все что начинается с # - это директивы, опять таки гугол в помощь там все подробно рассказано.

Любой вам скажет что всегда документацию по QT можно найти google поиском. Но прежде прочитайте все-таки учебник по с++, а то на защите завалитесь на первом же вопросе
0
алексей_26_рус
-1 / 0 / 0
Регистрация: 12.05.2012
Сообщений: 14
25.05.2012, 08:23  [ТС] #15
Drus, по поводу deligate.h я понял, создал его описал в нем класс

Цитата Сообщение от Drus Посмотреть сообщение
#include <QtGui>
#include <QtSql>
но компилятор выдает, что не найден каталог <QtSql>
0
Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
25.05.2012, 08:26 #16
#include <QtSql> - это библиотека для взаимодействия с базой данных, в моем случае с mysql, вам оно надо? если нет - смело удаляйте
0
Чистый
Автор FAQ
2713 / 1409 / 89
Регистрация: 08.09.2011
Сообщений: 3,741
Записей в блоге: 1
25.05.2012, 08:26 #17
подсказка: pro файл sql
0
25.05.2012, 08:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2012, 08:26
Привет! Вот еще темы с решениями:

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

Добавление текста в tableWidget
Подскажите, как избавиться от ошибки... Не могу установить текст в ячейку...

Цвет выводимых данных в tableWidget
Здравствуйте! Подскажите пожалуйста, как поменять цвет выводимых данных в...

Модели и QList/Tree/TableWidget
Почему модель получается добавить только в Q***View, а Q***Widget не получается?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru