Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
lexflax
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 627
1

Получение сигнала после выбора строки в tableview

03.01.2015, 06:18. Просмотров 1352. Ответов 7
Метки нет (Все метки)

Доброго времени суток.
Парни подскажите есть ли какой нибудь сигнал при двойном нажатии на строку из tableview?
У меня в Tableview выгружается информация из таблицы, несколько строк...
Хочу чтоб при двойном нажатии на любую строку , создавалась форма...
Как добавить форму знаю, не знаю как получить сигнал двойного клика на строчку в tableview... В qt такая возможность есть?
Заранее спасибо всем кто откликнется на вопрос.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2015, 06:18
Ответы с готовыми решениями:

Обновление tableview после выбора пункта combobox
Всех с новым годом) Помогите пожалуйста в решении следующей проблемы. У меня на главном окне...

Получение данных из компонента tableView
Доброго времени суток. В моей базе данных есть представление которое красиво выводит информацию на...

Получение значения выделенной ячейки tableView
Всем доброго времени суток. Пишу программу на QT Creater, используя модели, требуется взять...

Диалоги выбора цвета и шрифта - получение результата выбора
Имеем функцию Function FUN_OPEN_FONT() As String ' диалог выбора ЦВЕТА '...

Макрос для добавления строки после выбора пункта со спадающего меню
Здравствуйте. Прошу помощи в написании макроса. Задание заключается в: 1) При выборе в строке...

7
Pingvinoff
61 / 61 / 15
Регистрация: 20.08.2014
Сообщений: 593
03.01.2015, 08:58 2
Примерно так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
tableView   = new QTableView;
    tableView->setModel(model);
    tableView->setItemDelegate(new QSqlRelationalDelegate(this));
    tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    tableView->resizeColumnsToContents();
    tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
connect(tableView,SIGNAL(doubleClicked(QModelIndex)),
            this,SLOT(insertRecord()));
void MyClass::insertRecord(){
      MyForm *form = new MyForm;
      form->show();
}
1
lexflax
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 627
03.01.2015, 16:46  [ТС] 3
Спасибо все работает, нужное окно вызывается... Появился другой нюанс...

мне нужно по 2 щелчку вызывать 5 разных окон, в зависимости от того какие данные сейчас загружены в tableview.
Если загружены данные о возвратах то будет вызвано окно для редактирования возвратов, если загружены расходные накладные то будет вызвано окно для редактирования расходных накладных.
Сейчас естественно при любой загрузке вызывается одно и тоже окно...
Данные загружаются после выбора в combobox

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
void MainWindow::echoChanged(int index)
{
    QSqlQueryModel *rashodnie = new QSqlQueryModel;
    QSqlQuery query;
switch (index){
case 0:
    query.exec("SELECT * FROM rashodnie_nacladnie");
    break;
case 1:
    query.exec("SELECT * FROM vozvrati");
break;
case 2:
    query.exec("SELECT * FROM d_postuplenia");
    break;
case 3:
    query.exec("SELECT * FROM prihodi");
break;
case 4:
    query.exec("SELECT * FROM spisania");
break;
 
    default:
            return;  }
rashodnie->setQuery(query);
ui->tableView->setModel(rashodnie);
}
Можно как то связь эту установить чтоб учитывалось из какой таблицы сейчас выгружены данные, и тогда после двойного клика вызывалось нужное окно.

Добавлено через 24 секунды
C++ (Qt)
1
2
3
4
void MainWindow::insertRecord(){
      Prosmotrrashodnakladnih *prosmotrnakladnih = new Prosmotrrashodnakladnih;
      prosmotrnakladnih->show();
}
Добавлено через 26 минут
вот сейчас вызывается 2 формы , вместо определенной одной...
C++ (Qt)
1
2
3
4
5
6
7
void MainWindow::insertRecord(){
      Prosmotrrashodnakladnih *prosmotrnakladnih = new Prosmotrrashodnakladnih;
      prosmotrnakladnih->show();
 
      ProsmotrVozvratov *prosmotrvozvratov = new ProsmotrVozvratov;
      prosmotrvozvratov->show();
}
Добавлено через 5 часов 16 минут
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
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mainwindow1.h"
#include "ui_mainwindow1.h"
#include "voditeli.h"
#include "ui_voditeli.h"
#include "kontragenti.h"
#include "ui_kontragenti.h"
#include "torgoviepredstaviteli.h"
#include "ui_torgoviepredstaviteli.h"
#include<QSqlQuery>
#include <QtSql/QSqlTableModel>
#include "addrashodnainakladnai.h"
#include "ui_addrashodnainakladnai.h"
#include "prosmotrrashodnakladnih.h"
#include "ui_prosmotrrashodnakladnih.h"
#include "prosmotrvozvratov.h"
#include "ui_prosmotrvozvratov.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
   ui->pushButton->setIcon(QIcon("C:/tt/lesson/one/table_add.png"));
   ui->pushButton_2->setIcon(QIcon("C:/tt/lesson/one/table_delete.png"));
   QSqlQueryModel *rashodnie = new QSqlQueryModel;
   QSqlQuery query;
   query.exec("SELECT * FROM rashodnie_nacladnie");
   rashodnie->setQuery(query);
   ui->tableView->setModel(rashodnie);
   connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(echoChanged(int)));
   connect(ui->tableView,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(insertRecord()));
 
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
 
 
void MainWindow::on_action_4_triggered()
{
    this->close();
}
 
void MainWindow::on_action_5_triggered()
{
   MainWindow1 *w1 = new  MainWindow1;
   w1->show();
}
 
void MainWindow::on_action_2_triggered()
{
   Voditeli *v1= new Voditeli;
   v1->show();
}
 
void MainWindow::on_action_triggered()
{
    Kontragenti *k1= new Kontragenti;
    k1->show();
}
 
void MainWindow::on_action_3_triggered()
{
    Torgoviepredstaviteli *t1= new Torgoviepredstaviteli;
    t1->show();
}
 
 
void MainWindow::on_pushButton_clicked()
{
 AddRashodnaiNakladnai * ras = new AddRashodnaiNakladnai;
 ras->show();
}
 
void MainWindow::echoChanged(int index)
{
    QSqlQueryModel *rashodnie = new QSqlQueryModel;
    QSqlQuery query;
switch (index){
case 0:
    query.exec("SELECT * FROM rashodnie_nacladnie");
    break;
case 1:
    query.exec("SELECT * FROM vozvrati");
break;
case 2:
    query.exec("SELECT * FROM d_postuplenia");
    break;
case 3:
    query.exec("SELECT * FROM prihodi");
break;
case 4:
    query.exec("SELECT * FROM spisania");
break;
 
    default:
            return;  }
rashodnie->setQuery(query);
ui->tableView->setModel(rashodnie);
}
 
void MainWindow::insertRecord(){
      Prosmotrrashodnakladnih *prosmotrnakladnih = new Prosmotrrashodnakladnih;
      prosmotrnakladnih->show();
 
      ProsmotrVozvratov *prosmotrvozvratov = new ProsmotrVozvratov;
      prosmotrvozvratov->show();
}
0
Shtirliz72
202 / 162 / 41
Регистрация: 25.10.2013
Сообщений: 527
04.01.2015, 04:01 4
Цитата Сообщение от lexflax Посмотреть сообщение
Можно как то связь эту установить чтоб учитывалось из какой таблицы сейчас выгружены данные, и тогда после двойного клика вызывалось нужное окно.
Можно - просто запоминай индекс выбранных данных(сделай соответствующую переменную в классе) и точно также по запомненному индексу вызывай нужное тебе окно.
И, посмотрел я сейчас на твой код, не забывай выделенные через new ресурсы освобождать через delete! Сами по себе они не освободятся!!
1
04.01.2015, 04:01
lexflax
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 627
04.01.2015, 10:21  [ТС] 5
Добавил переменную класса, переменная nomer.
Сделал через if

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void MainWindow::insertRecord(){
    if (nomer==0){
 
 
      Prosmotrrashodnakladnih *prosmotrnakladnih = new Prosmotrrashodnakladnih;
      prosmotrnakladnih->show();}
    else {
 
 
      ProsmotrVozvratov *prosmotrvozvratov = new ProsmotrVozvratov;
      prosmotrvozvratov->show();
 
    }
}
Не получается сделать через switch сделать
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void MainWindow::insertRecord()
{
 
    switch (nomer){
    case 0:
        Prosmotrrashodnakladnih *prosmotrnakladnih = new Prosmotrrashodnakladnih;
        prosmotrnakladnih->show();
        break;
    case 1:
        ProsmotrVozvratov *prosmotrvozvratov = new ProsmotrVozvratov;
        prosmotrvozvratov->show();
    break;
 
      default:
           return;  }
 
}
Пишет ошибки

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
C:\tt\lesson\one\mainwindow.cpp:118: ошибка: jump to case label [-fpermissive]
     case 1:
          ^
C:\tt\lesson\one\mainwindow.cpp:115: error:   crosses initialization of 'Prosmotrrashodnakladnih* prosmotrnakladnih'
         Prosmotrrashodnakladnih *prosmotrnakladnih = new Prosmotrrashodnakladnih;
                                  ^
C:\tt\lesson\one\mainwindow.cpp:123: ошибка: jump to case label [-fpermissive]
       default:
       ^
C:\tt\lesson\one\mainwindow.cpp:119: error:   crosses initialization of 'ProsmotrVozvratov* prosmotrvozvratov'
         ProsmotrVozvratov *prosmotrvozvratov = new ProsmotrVozvratov;
                            ^
C:\tt\lesson\one\mainwindow.cpp:115: error:   crosses initialization of 'Prosmotrrashodnakladnih* prosmotrnakladnih'
         Prosmotrrashodnakladnih *prosmotrnakladnih = new Prosmotrrashodnakladnih;
                                  ^
Добавлено через 8 минут
в чем проблема можно как то через switch сделать?
0
Pingvinoff
61 / 61 / 15
Регистрация: 20.08.2014
Сообщений: 593
04.01.2015, 13:29 6
Лучший ответ Сообщение было отмечено lexflax как решение

Решение

C++ (Qt)
1
2
3
4
5
6
7
8
9
case 0:{
     //code
     break;
}
case 1:{
       //code
       break;
}
....
Попробуйте в скобочки кейсы взять. Иногда помогает.
не по теме:
И завязывайте с транслитом. Читать невозможно. Я тоже английского не знаю толком. поэтому гугл-транслит мой друг.
1
Shtirliz72
202 / 162 / 41
Регистрация: 25.10.2013
Сообщений: 527
04.01.2015, 17:37 7
Цитата Сообщение от lexflax Посмотреть сообщение
Не получается сделать через switch сделать
void MainWindow::insertRecord()
{
switch (nomer){
* * case 0:
* * * * Prosmotrrashodnakladnih *prosmotrnakladnih = new Prosmotrrashodnakladnih;
* * * * prosmotrnakladnih->show();
* * * * break;
* * case 1:
* * * * ProsmotrVozvratov *prosmotrvozvratov = new ProsmotrVozvratov;
* * * * prosmotrvozvratov->show();
* * break;
default:
* * * * * *return; *}
}
Выше абсолютно правильно написали - чтобы в switch какую-либо переменную объявить и работать с ней - вы по правилам должны сиё действие заключать в скобки.
0
lexflax
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 627
04.01.2015, 17:39  [ТС] 8
Я понял.
Вопрос решен, всем спасибо)
0
04.01.2015, 17:39
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2015, 17:39

File not found extension was unheeded после выбора картинки в диалоге выбора файла
MySQL DB вот код Private Sub Button2_Click(sender As Object, e As EventArgs) Handles...

Выделение строки tableview
Использую qtableview и qfilesystemmodel для просмотра файловой системы. При переходе по папкам...

После выбора варианта загрузки система виснет - Windows XP . загрузка идет тока с выбора безопасного режима
вот видио Кто знает что такое ?


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

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

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