Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
tram1

Добавить ветку в элемент QTreeWidget

29.06.2013, 14:03. Показов 19262. Ответов 85
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Пытаюсь добавить ветку в элемент QTreeWidget. Вот такой вариант работает:

C++ (Qt)
1
2
3
QStringList qStrL;
qStrL << "secondname";
ui->treeWidget->addTopLevelItem(new QTreeWidgetItem(qStrL);
но когда я пытаюсь сделать немного иначе:

C++ (Qt)
1
2
3
4
QStringList qStrL;
qStrL << "secondname";
QTreeWidgetItem * s_tree = new QTreeWidgetItem(qStrL);
ui->treeWidget->addTopLevelItem(s_tree);
то никаких элементов не добавляется. Может быть я конечно не понимаю, но по моему это одно и то же действие, и должно работать. Подскажите, в чем проблема? Заранее спасибо!
Воспользоваться первым не могу, потому что мне еще нужно добавить дополнительные ответвления к элементу.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.06.2013, 14:03
Ответы с готовыми решениями:

Война с drag and drop в QTreeWidget c отслеживанием в какую ветку был перенесен QTreeWidgetItem
Не могу решить такую задачу. Есть обычная иерархия QTreeWidget. Как реализовать drag and drop...

Сохранение текущего элемент в QTreeWidget
Добрый день, возникла проблема. Добавляю каждую секунду (таймер) в QTreeWidget элементы, перед...

QTreeWidget
Мне нужно поместить элемент в список rezult = new QTreeWidget; . . . QTreeWidgetItem*...

85
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
08.06.2025, 18:15
Студворк — интернет-сервис помощи студентам
да то и был весь код
C++ (Qt)
1
2
3
4
5
6
void MainWindow::on_treeView_clicked(const QModelIndex &index)
{
auto tree=new QTreeView;
    connect(tree, &QTreeView::clicked, [](const QModelIndex &index){
        qInfo()<<index.column();
    });
Добавлено через 14 минут
Цитата Сообщение от sdf45 Посмотреть сообщение
Пробовал работать с примерами выше по теме?
Выложи весь код.
да это по сути и есть весь код
C++ (Qt)
1
2
3
4
5
6
7
void MainWindow::on_treeView_clicked(const QModelIndex &index)
{
    auto tree=new QTreeView;
    connect(tree, &QTreeView::clicked, [](const QModelIndex &index){
        qInfo()<<index.column();
    });
}
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
08.06.2025, 18:23
aksident, ну ты же в слоте создаешь пустой, висящий в вакууме виджет и цепляешь на него коннект. снова.
я же выше указывал на эту ошибку(пост 26 и 28), почему ты повторяешь ее?
вот вдумайся, что ты делаешь.
Тебе стоит поизучать азы по ссылкам уважаемого SmallEvil, попробовать на простых примерах(хотя бы из этой ветки). И многим уже советовал, забить временно на дизайнер, а делать все руками - имхо так проще понять.
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
08.06.2025, 18:27
Цитата Сообщение от sdf45 Посмотреть сообщение
ну ты же в слоте создаешь пустой, висящий в вакууме виджет и цепляешь на него коннект
вот здесь пожалуйста по подробнее, я нигде не смог найти нормального описания, вся литература почему то стыдливо обходит эту тему, мне его к layout привязать обязательно надо что ли?
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
08.06.2025, 18:37
Цитата Сообщение от aksident Посмотреть сообщение
вот здесь пожалуйста по подробнее
ну вот у тебя же проект с формой.
на ней ты создал QTreeVidget.
потом в слоте ты создаешь второй виджет auto tree=new QTreeView;
он не то же самое, что виджет созданный в дизайнере на форме.
это отдельный виджет
виджет , созданный в дизайнере на форме, включен в компоновку окна и иерархические связи окна, он отображается в окне, и уничтожается при уничтожении окна.
виджет, который ты в слоте создал-не включен в компоновку, не связан с окном, не имеет владельца , не отображается и не уничтожается. Он просто висит где-то в ваканде, и остальной мир о нем не знает.
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
08.06.2025, 18:41
а, да, тут я затупил, так как мне с созданного в форме виджета получить то что мне нужно, там есть слот clicked я его к нему подключился, но вот какую то информацию кроме содержимого item не могу.
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
08.06.2025, 18:51
Цитата Сообщение от aksident Посмотреть сообщение
так как мне с созданного в форме виджета получить то что мне нужно,
выше наворочена куча примеров.
Только если (в моих примерах например) виджет создается руками, у тебя он уже создан, понимаешь?
там где у меня tree-> у тебя ui->treeView->
Создавать еще один виджет не надо (типа auto tree=new QTreeView;-убери нафиг)
А вообще ты хоть пробовал компилировать примеры из этой темы?
Попробуй создать новый проект, без формы, создать на нем руками компоновку с виджетами, какой нить простой QTreeView или хоть QTreeWidget и потренируйся с ним. Потом уже ченить посложнее.
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
08.06.2025, 18:56
Цитата Сообщение от sdf45 Посмотреть сообщение
там где у меня tree-> у тебя ui->treeView->
да я после того как написал сам заметил это, весь прикол в том что qInfo()<<index.column(); в нем вообще ничего не выдает
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
08.06.2025, 19:03
Цитата Сообщение от sdf45 Посмотреть сообщение
выше наворочена куча примеров.
Цитата Сообщение от sdf45 Посмотреть сообщение
Попробуй создать новый проект, без формы, создать на нем руками компоновку с виджетами, какой нить простой QTreeView или хоть QTreeWidget и потренируйся с ним.
пока ты этого не попробуешь, я выхожу из обсуждения, извини.
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
08.06.2025, 19:09
Цитата Сообщение от sdf45 Посмотреть сообщение
пока ты этого не попробуешь, я выхожу из обсуждения, извини.
попробую завтра, но спасибо за потраченное время
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
18.06.2025, 15:18
в общем пошел таким путем - каждой колонке присвоил заголовок и решил получить тупо его значение, что выявило такую странность, судя по всему сигнал on_treeView_clicked получает в QModelIndex &index только значение первого столбца, независимо от того в каком было событие, почему так?
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
18.06.2025, 17:30
aksident, вот тебе пример заполнения таблицы sql запросом, таблицы с моделью sql связей и построения дерева на основе выборки sql запросом, а так же вывода в статус бар где чего кликнуто.
Зы и снова и опять я бы советовал использовать таблицы вместо дерева, если это не прям "ппц надо и все тут", так как имхо, построение вручную дерева на кучу узлов - намного более худший вариант, чем проработанное построение таблиц самой Qt.

Кликните здесь для просмотра всего текста

Создай новый проект Qt Widgets без формы, удали все из mainwindow.cpp и вставь туда этот листинг
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#include "mainwindow.h"
 
#include <QSqlQuery>
#include <QSqlError>
#include <QSqlQueryModel>
#include <QStandardItemModel>
#include <QSqlRelationalTableModel>
#include <QTreeView>
#include <QTableView>
#include <QLabel>
#include <QStatusBar>
#include <QVBoxLayout>
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");
    if(!db.open()){
        qDebug()<<db.lastError().text();
        return;
    }
 
    statusBar()->show();//показываем статус бар окна, в QMainWindow он встроен по умолчанию
 
    //центральный виджет окна
    auto form=new QWidget;
    auto layout=new QVBoxLayout;
    form->setLayout(layout);
    setCentralWidget(form);
    
    //контент окна - пара таблиц и дерево
 
    //таблица, заполняемая sql запросами
    auto table=new QTableView;
    table->setObjectName("Table + QSqlQueryModel");//даем имя обьекту таблице, что бы выводить в статус бар
    layout->addWidget(new QLabel("Table + QSqlQueryModel"));
    layout->addWidget(table);//добавляем таблицу в компоновку окна
 
    //таблица на основе связанных ключей
    auto relationTable=new QTableView;
    relationTable->setObjectName("Table + QSqlRelationalTableModel");
    layout->addWidget(new QLabel("Table + QSqlRelationalTableModel"));
    layout->addWidget(relationTable);
 
    //дерево
    auto tree=new QTreeView;
    tree->setObjectName("Tree + QStandardItemModel");
    layout->addWidget(new QLabel("Tree + QStandardItemModel"));
    layout->addWidget(tree);
 
    //модель для дерева
    auto treeModel= new QStandardItemModel;
    treeModel->setColumnCount(3);
    treeModel->setHorizontalHeaderLabels({"company", "name", "surname"});//заголовок
    tree->setModel(treeModel);
    auto treeRoot=treeModel->invisibleRootItem();//самый верхний узел дерева
 
    //модель для sql запросов
    auto queryModel=new QSqlQueryModel();
    table->setModel(queryModel);  //устанавливается в соотв таблицу
 
    //запрос
    QSqlQuery query(db);
    query.exec("PRAGMA foreign_keys = ON;");//разрешаем связанные ключи
 
    //создаем таблицы в бд (для примера, а у тебя уже есть)
    //заполняю таблицы через exec для меньше текста, а вообще надо prepare
 
    //таблица с именами
    query.exec("CREATE TABLE Names(id INTEGER PRIMARY KEY AUTOINCREMENT,"
               "name TEXT);");
    query.exec("INSERT INTO Names ( name) VALUES ( 'Bill');");
    query.exec("INSERT INTO Names ( name) VALUES ( 'Elon');");
    query.exec("INSERT INTO Names ( name) VALUES ( 'Steve');");
 
    //таблица с фамилиями
    query.exec("CREATE TABLE Surnames(id INTEGER PRIMARY KEY AUTOINCREMENT,"
               "surname TEXT);");
    query.exec("INSERT INTO Surnames ( surname) VALUES ( 'Gates');");
    query.exec("INSERT INTO Surnames ( surname) VALUES ( 'Musk');");
    query.exec("INSERT INTO Surnames ( surname) VALUES ( 'Jobs');");
 
    //таблица с компаниями, сводная так сказать, со связанными ключами на таблицы имен и фамилий
    query.exec("CREATE TABLE Companies(id INTEGER PRIMARY KEY AUTOINCREMENT,"
               "company TEXT,"
               "name INTEGER,"
               "surname INTEGER,"
               "FOREIGN KEY(name) REFERENCES Names(id),"
               "FOREIGN KEY(surname) REFERENCES Surnames(id));");
 
    query.exec("INSERT INTO Companies ( company, name, surname) VALUES ( 'Microsoft',1,1);");
    query.exec("INSERT INTO Companies ( company, name, surname) VALUES ( 'SpaceX',2,2);");
    query.exec("INSERT INTO Companies ( company, name, surname) VALUES ( 'Apple',3,3);");
 
    //выборка нужного по ключам
    query.exec("SELECT Companies.company, Names.name, Surnames.surname"
               " FROM Companies LEFT JOIN Names ON Companies.name = Names.id"
               " LEFT JOIN Surnames ON Companies.surname = Surnames.id");
 
    //формируем дерево на основе запроса выше
    while (query.next()){
        QString company = query.value(0).toString();
        QString name = query.value(1).toString();
        QString surname = query.value(2).toString();
 
        auto node = new QStandardItem(company);//основной узел
        treeRoot->appendRow(node);//добавляем его в рут
        //саб узел для узла node, можно так
        //node->appendRow({new QStandardItem, new QStandardItem(name), new QStandardItem(surname)});
        //или так
        node->setChild(0, 1, new QStandardItem(name));
        node->setChild(0, 2, new QStandardItem(surname));
    }
 
    //в модель запросов, которая подключена к таблице, основанной на запросах, передаем запрос выборки
    //и в этой таблице отобразятся данные, которые выбраны в запросе
    queryModel->setQuery(query); 
 
    //чисто для примера (необязательная часть)
    //создаем модель связей, устанавливаем связи с таблицами 
    //устанавливаем эту модель в соотв таблицу
    //этот шаг делает тоже самое, что заполнение таблицы выше(sql запросом) -просто другим способом
    auto relationModel=new QSqlRelationalTableModel; //модель для sql связей
    relationModel->setTable("Companies"); //эта модель работает с таблицей Companies в БД
    relationModel->removeColumn(0);//прячем колонку с ID так как нумерация в таблице уже есть
 
    //колонка таблицы Companyes с индексом 1(по сути 2-я тк нумерация с 0)
    //связывается с колонкой name таблицы Names c выборкой по id
    //речь тут идет про таблицы в БД
    relationModel->setRelation(1, QSqlRelation("Names", "id", "name"));
 
    relationModel->setRelation(2, QSqlRelation("Surnames", "id", "surname"));//по аналогии
    relationTable->setModel(relationModel);//устанавливаем модель в соотв таблицу
    relationModel->select();
 
    //выводим в статус бар окна имя таблицы, где кликнули, и строку/колонку ячейки, кликнутой в таблице
    //status -это лямбда, принимаюшая обьект sender(виджет-таблицу) по которой кликнули, и индекс кликнутой ячейки
    //если не знаешь что такое лямбда-можно упрощенно считать ее функцией на первых порах
    //все это выводится в статус бар окна (имя таблицы и адрес ячейки)
 
    auto status=[this]( QObject *sender, const QModelIndex &index){
        if(sender && index.isValid())
            statusBar()->showMessage(QString(sender->objectName() + ": cell clicked %1 , %2")
                                         .arg(index.row()+1)
                                         .arg(index.column()+1));
    };
 
    //коннекты для таблиц, сигнал клика по ячейке связан с лямбддой(которая выступает в качестве слота)
    //в эту лямбду передаем лямбду status, которую выше написали,
    //а так же обьект, испустивший сигнал - sender(),
    // индекс кликнутой ячейки , который передается самим сигналом clicked()
    //и принимается в параметрах лямбды const QModelIndex &index
 
    connect(table, &QTableView::clicked, this, [this, status](const QModelIndex &index){
        status(sender(), index);
    });
    connect(relationTable, &QTableView::clicked, this, [this, status](const QModelIndex &index){
        status(sender(), index);
    });
    connect(tree, &QTreeView::clicked, this, [this, status](const QModelIndex &index){
        status(sender(), index);
    });
}
 
MainWindow::~MainWindow() {}
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
18.06.2025, 17:44
aksident, вот тебе пример заполнения таблицы sql запросом, таблицы с моделью sql связей и построения дерева на основе выборки sql запросом, а так же вывода в статус бар где чего кликнуто.
Зы и снова и опять я бы советовал использовать таблицы вместо дерева, если это не прям "ппц надо и все тут", так как имхо, построение вручную дерева на кучу узлов - намного более худший вариант, чем проработанное построение таблиц самой Qt.

Кликните здесь для просмотра всего текста

Создай новый проект Qt Widgets без формы, удали все из mainwindow.cpp и вставь туда этот листинг
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#include "mainwindow.h"
 
#include <QSqlQuery>
#include <QSqlError>
#include <QSqlQueryModel>
#include <QStandardItemModel>
#include <QSqlRelationalTableModel>
#include <QTreeView>
#include <QTableView>
#include <QLabel>
#include <QStatusBar>
#include <QVBoxLayout>
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");
    if(!db.open()){
        qDebug()<<db.lastError().text();
        return;
    }
 
    statusBar()->show();//показываем статус бар окна, в QMainWindow он встроен по умолчанию
 
    //центральный виджет окна
    auto form=new QWidget;
    auto layout=new QVBoxLayout;
    form->setLayout(layout);
    setCentralWidget(form);
    
    //контент окна - пара таблиц и дерево
 
    //таблица, заполняемая sql запросами
    auto table=new QTableView;
    table->setObjectName("Table + QSqlQueryModel");//даем имя обьекту таблице, что бы выводить в статус бар
    layout->addWidget(new QLabel("Table + QSqlQueryModel"));
    layout->addWidget(table);//добавляем таблицу в компоновку окна
 
    //таблица на основе связанных ключей
    auto relationTable=new QTableView;
    relationTable->setObjectName("Table + QSqlRelationalTableModel");
    layout->addWidget(new QLabel("Table + QSqlRelationalTableModel"));
    layout->addWidget(relationTable);
 
    //дерево
    auto tree=new QTreeView;
    tree->setObjectName("Tree + QStandardItemModel");
    layout->addWidget(new QLabel("Tree + QStandardItemModel"));
    layout->addWidget(tree);
 
    //модель для дерева
    auto treeModel= new QStandardItemModel;
    treeModel->setColumnCount(3);
    treeModel->setHorizontalHeaderLabels({"company", "name", "surname"});//заголовок
    tree->setModel(treeModel);
    auto treeRoot=treeModel->invisibleRootItem();//самый верхний узел дерева
 
    //модель для sql запросов
    auto queryModel=new QSqlQueryModel();
    table->setModel(queryModel);  //устанавливается в соотв таблицу
 
    //запрос
    QSqlQuery query(db);
    query.exec("PRAGMA foreign_keys = ON;");//разрешаем связанные ключи
 
    //создаем таблицы в бд (для примера, а у тебя уже есть)
    //заполняю таблицы через exec для меньше текста, а вообще надо prepare
 
    //таблица с именами
    query.exec("CREATE TABLE Names(id INTEGER PRIMARY KEY AUTOINCREMENT,"
               "name TEXT);");
    query.exec("INSERT INTO Names ( name) VALUES ( 'Bill');");
    query.exec("INSERT INTO Names ( name) VALUES ( 'Elon');");
    query.exec("INSERT INTO Names ( name) VALUES ( 'Steve');");
 
    //таблица с фамилиями
    query.exec("CREATE TABLE Surnames(id INTEGER PRIMARY KEY AUTOINCREMENT,"
               "surname TEXT);");
    query.exec("INSERT INTO Surnames ( surname) VALUES ( 'Gates');");
    query.exec("INSERT INTO Surnames ( surname) VALUES ( 'Musk');");
    query.exec("INSERT INTO Surnames ( surname) VALUES ( 'Jobs');");
 
    //таблица с компаниями, сводная так сказать, со связанными ключами на таблицы имен и фамилий
    query.exec("CREATE TABLE Companies(id INTEGER PRIMARY KEY AUTOINCREMENT,"
               "company TEXT,"
               "name INTEGER,"
               "surname INTEGER,"
               "FOREIGN KEY(name) REFERENCES Names(id),"
               "FOREIGN KEY(surname) REFERENCES Surnames(id));");
 
    query.exec("INSERT INTO Companies ( company, name, surname) VALUES ( 'Microsoft',1,1);");
    query.exec("INSERT INTO Companies ( company, name, surname) VALUES ( 'SpaceX',2,2);");
    query.exec("INSERT INTO Companies ( company, name, surname) VALUES ( 'Apple',3,3);");
 
    //выборка нужного по ключам
    query.exec("SELECT Companies.company, Names.name, Surnames.surname"
               " FROM Companies LEFT JOIN Names ON Companies.name = Names.id"
               " LEFT JOIN Surnames ON Companies.surname = Surnames.id");
 
    //формируем дерево на основе запроса выше
    while (query.next()){
        QString company = query.value(0).toString();
        QString name = query.value(1).toString();
        QString surname = query.value(2).toString();
 
        auto node = new QStandardItem(company);//основной узел
        treeRoot->appendRow(node);//добавляем его в рут
        //саб узел для узла node, можно так
        //node->appendRow({new QStandardItem, new QStandardItem(name), new QStandardItem(surname)});
        //или так
        node->setChild(0, 1, new QStandardItem(name));
        node->setChild(0, 2, new QStandardItem(surname));
    }
 
    //в модель запросов, которая подключена к таблице, основанной на запросах, передаем запрос выборки
    //и в этой таблице отобразятся данные, которые выбраны в запросе
    queryModel->setQuery(query); 
 
    //чисто для примера (необязательная часть)
    //создаем модель связей, устанавливаем связи с таблицами 
    //устанавливаем эту модель в соотв таблицу
    //этот шаг делает тоже самое, что заполнение таблицы выше(sql запросом) -просто другим способом
    auto relationModel=new QSqlRelationalTableModel; //модель для sql связей
    relationModel->setTable("Companies"); //эта модель работает с таблицей Companies в БД
    relationModel->removeColumn(0);//прячем колонку с ID так как нумерация в таблице уже есть
 
    //колонка таблицы Companyes с индексом 1(по сути 2-я тк нумерация с 0)
    //связывается с колонкой name таблицы Names c выборкой по id
    //речь тут идет про таблицы в БД
    relationModel->setRelation(1, QSqlRelation("Names", "id", "name"));
 
    relationModel->setRelation(2, QSqlRelation("Surnames", "id", "surname"));//по аналогии
    relationTable->setModel(relationModel);//устанавливаем модель в соотв таблицу
    relationModel->select();
 
    //выводим в статус бар окна имя таблицы, где кликнули, и строку/колонку ячейки, кликнутой в таблице
    //status -это лямбда, принимаюшая обьект sender(виджет-таблицу) по которой кликнули, и индекс кликнутой ячейки
    //если не знаешь что такое лямбда-можно упрощенно считать ее функцией на первых порах
    //все это выводится в статус бар окна (имя таблицы и адрес ячейки)
 
    auto status=[this]( QObject *sender, const QModelIndex &index){
        if(sender && index.isValid())
            statusBar()->showMessage(QString(sender->objectName() + ": cell clicked %1 , %2")
                                         .arg(index.row()+1)
                                         .arg(index.column()+1));
    };
 
    //коннекты для таблиц, сигнал клика по ячейке связан с лямбддой(которая выступает в качестве слота)
    //в эту лямбду передаем лямбду status, которую выше написали,
    //а так же обьект, испустивший сигнал - sender(),
    // индекс кликнутой ячейки , который передается самим сигналом clicked()
    //и принимается в параметрах лямбды const QModelIndex &index
 
    connect(table, &QTableView::clicked, this, [this, status](const QModelIndex &index){
        status(sender(), index);
    });
    connect(relationTable, &QTableView::clicked, this, [this, status](const QModelIndex &index){
        status(sender(), index);
    });
    connect(tree, &QTreeView::clicked, this, [this, status](const QModelIndex &index){
        status(sender(), index);
    });
}
 
MainWindow::~MainWindow() {}


Добавлено через 1 минуту

Не по теме:

блин какой то лаг и пост продублировался, модератор подправь плз



Добавлено через 13 минут
зы зы кстати разбираться в сабже в свое время мне помог
этот замечательный пример
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
18.06.2025, 18:10
спасибо, но все же я так и не понял, чем этот простой код плох? он для меня идеален, содержимое дерева не будет изменяться НИКОГДА, оно полностью статичное, так зачем мне модели и прочая лабуда и тонны программного кода? Неужели нет возможности тупо отловить с виджета простейший сигнал????
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
18.06.2025, 18:34
Цитата Сообщение от aksident Посмотреть сообщение
чем этот простой код плох?
какой именно? если речь идет о посте 41 то там трижды вложенный while, я не вникал особо но по моему это неоптимально(или вообще неправильно), хотя мб ошибаюсь - просто не вникал.

Цитата Сообщение от aksident Посмотреть сообщение
зачем мне модели и прочая лабуда
эта лабуда правильно написана с учетом всяческих нюансов и оптимизирована, а при разработке вручную можно накосячить, особенно при отсутствии опыта. Вот возмет твоя прога и повиснет к ежам при формировании дерева на туеву хучу узлов-тогда и узнаешь, зачем

Цитата Сообщение от aksident Посмотреть сообщение
Неужели нет возможности тупо отловить с виджета простейший сигнал????
уже много раз показано, как это делать, в примерах выше. И выше же ты делаешь какие-то неосмысленные движения, и не можешь понять почему не работает. Вот по последней ошибке - ты в слоте, который вызывается при клике на ячейку в дереве, создаешь еще одно пустое дерево и цепляешь на него конект для сигнала клика по ячейке(пустого дерева, которое не отображается даже в окне). А в посте 70 даже код не привел.

Поэтому еще и еще (и еще!) раз: разбери примеры, которые давали люди в этой теме, и я в том числе. Иначе это все не имеет смысла просто, я хз
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
18.06.2025, 19:24
да я все выше изложенное перепробовал что касается моей проблемы.
Цитата Сообщение от sdf45 Посмотреть сообщение
какой именно? если речь идет о посте 41 то там трижды вложенный while, я не вникал особо но по моему это неоптимально(или вообще неправильно), хотя мб ошибаюсь - просто не вникал.
таких примеров использования while пруд пруди. И в чем проблема что я заполняю дерево тремя циклами по кругу??
я описал конкретную проблему но мне упорно все советуют написать миллион текста кода, да зачем оно мне? У меня конкретная проблема, не ловится index с виджета, ни встроенным сигналом ни если сам создам connect, всегда в нем значения первого столбца, я про это спрашиваю, почему он не меняется при выборе других значений?

Добавлено через 14 минут
Кстати, сам этот код я взял на страницах этого форума, немного изменил под себя и все.

Добавлено через 16 минут
index.row() выдает строки исправно, index.column() всегда дает 0.
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
18.06.2025, 19:31
Цитата Сообщение от aksident Посмотреть сообщение
У меня конкретная проблема, не ловится index с виджета, ни встроенным сигналом ни если сам создам connect, всегда в нем значения первого столбца
ну выложи все относящееся к этой проблеме.

Добавлено через 4 минуты
Цитата Сообщение от aksident Посмотреть сообщение
index.row() выдает строки исправно, index.column() всегда дает 0.
и сколько колонок в каждом узле?
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
18.06.2025, 19:35
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
void MainWindow::on_pushButton_clicked()
{
    QTreeView* tree = new QTreeView;
    QStandardItemModel* model = new QStandardItemModel;
 
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC","bdsi");
    db.setConnectOptions();
    db.setDatabaseName("Driver={SQL Server};Server=127.0.0.1;Trusted_Connection=Yes;Database=bdsi;");
    db.setUserName("sa");
    db.setPassword("***********");
    db.open();
 
    QSqlQuery mobjekts(db);
    mobjekts.exec("SELECT mid, mobject FROM MObjekt");
    while (mobjekts.next()) {
        QStandardItem* mobjekt = new QStandardItem(mobjekts.record().value(1).toString());
        model->setHeaderData(0, Qt::Horizontal, QObject::tr("1"));
        model->appendRow(mobjekt);
        QSqlQuery sobjects(db);
        sobjects.prepare("SELECT sid, sobjekt FROM SObjekt WHERE mid="+mobjekts.record().value(0).toString());
        sobjects.exec();
        while (sobjects.next()) {
            QStandardItem* sobject = new QStandardItem(sobjects.record().value(1).toString());
            model->setHeaderData(1, Qt::Horizontal, QObject::tr("2"));
            mobjekt->appendRow(sobject);
            QSqlQuery objekts(db);
            objekts.prepare("SELECT id FROM Objekt WHERE sid="+sobjects.record().value(0).toString());
            objekts.exec();
            while(objekts.next()) {
                QStandardItem* objekt = new QStandardItem(objekts.record().value(0).toString());
                model->setHeaderData(2, Qt::Horizontal, QObject::tr("3"));
                sobject->appendRow(objekt);
            }
        }
    }
    tree->setModel(model);
    ui->treeView->setHeaderHidden(true);
    ui->treeView->setModel(model);
}
 
void MainWindow::on_treeView_clicked(const QModelIndex &index)
{
 
    qInfo() << ui->treeView->model()->headerData(index.column(),Qt::Horizontal).toString();
    
 
}
вот, как то так, присвоил всем столбцам заголовки и пытаюсь их поймать, но в ответ всегда "1" если там меняю на что то другое то это и получаю, из чего сделал вывод что все правильно.

Добавлено через 1 минуту
по одной колонке в узле
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
18.06.2025, 20:03
Зачем во while по хз сколько раз менять название колонки,
если можно сделать один раз за пределами цикла?
C++ (Qt)
1
2
treeModel->setColumnCount(кол-во колонок);
treeModel->setHorizontalHeaderLabels({"название", "название", "название"});
Я добавил твой коннект в свой пример и у меня все выводит правильно.

Цитата Сообщение от aksident Посмотреть сообщение
по одной колонке в узле
В каждом узле нумерация с нуля. Если у тебя все узлы лежат в одной колонке то так и будет происходить, как ты пишешь о проблеме.

Я не зря пишу же примеры, вот
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
while (query.next()){
        QString company = query.value(0).toString();
        QString name = query.value(1).toString();
        QString surname = query.value(2).toString();
 
        auto node = new QStandardItem(company);//основной узел
        treeRoot->appendRow(node);//добавляем его в рут
        //саб узел для узла node, можно так
        //node->appendRow({new QStandardItem, new QStandardItem(name), new QStandardItem(surname)});<--- три колонки
        //или так
        node->setChild(0, 1, new QStandardItem(name)); <--- в колонку 1 (вторую)
        node->setChild(0, 2, new QStandardItem(surname)); <--- в колонку 2 (третью)
    }
А ты судя по всему, при беглом просмотре кода, лепишь все в первую колонку с индексом ноль
Цитата Сообщение от aksident Посмотреть сообщение
mobjekt->appendRow(sobject);
и так далее
Мне лень вникать, проверь свои while
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
18.06.2025, 20:38
Цитата Сообщение от sdf45 Посмотреть сообщение
А ты судя по всему, при беглом просмотре кода, лепишь все в первую колонку с индексом ноль
спасибо, были подозрения, буду опять разбираться

Добавлено через 53 секунды
а названия колонок мне совершенно не нужно, мне нужен только заголовок который не будет отображаться

Добавлено через 8 минут
блин, даже не думал что в одной колонке может быть несколько узлов, нормальной толковой документации по treeView нигде нет, тупо описание класса и все.

Добавлено через 18 минут
Цитата Сообщение от sdf45 Посмотреть сообщение
Я не зря пишу же примеры, вот
да мне этот пример абсолютно не подойдет, но все равно спасибо
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
19.06.2025, 00:10
Цитата Сообщение от aksident Посмотреть сообщение
мне упорно все советуют написать миллион текста кода, да зачем оно мне?
Действительно, две строчки и всё, готово.
1. int main
2. exit()

Цитата Сообщение от sdf45 Посмотреть сообщение
Я не зря пишу же примеры
Это уже под очень большим вопросом.
Человек из века велосипедов.
Хотя и тогда летали люди.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.06.2025, 00:10

QTreeWidget "Drag and Drop" только на своем уровне
Как проще реализовать. чтобы перетаскивание в treewidget было возможно только на том уровне, на...

Как вставить в QTreeWidget
Я создал в QtCreator QTreeWidget Что нужно внутри слота написать, чтобы реализовать следующее:...

Как отловить сигнал при нажатии по QTreeWidget левой кнопкой не по элементу
Столкнулся с проблемой: Как отловить сигнал при нажатии по QTreeWidget левой кнопкой не по...

Узнать количество веток в QTreeWidget
Есть QTreeWidget c 3 уровнями QTreeWidgetItem. Вопрос: как узнать, есть ли в дереве ветки 3-го...

QTreeWidget
Возникло пару проблем по данному винджету. На QtreeWidget добавлено несколько элементов(все...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru