Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Програмирование платформенно-независимых систем > Trolltech Qt
Перезагрузить страницу Получение сигнала после выбора строки в tableview
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Lexflax Lexflax вне форума
Member
 
Сообщений: 92
Сказал(а) спасибо: 35
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.04.2011
Post Получение сигнала после выбора строки в tableview - 03.01.2015, 07:25

Доброго времени суток.
Парни подскажите есть ли какой нибудь сигнал при двойном нажатии на строку из tableview?
У меня в Tableview выгружается информация из таблицы, несколько строк...
Хочу чтоб при двойном нажатии на любую строку , создавалась форма...
Как добавить форму знаю, не знаю как получить сигнал двойного клика на строчку в tableview... В qt такая возможность есть?
Заранее спасибо всем кто откликнется на вопрос.
Ответить с цитированием
  (#2 (permalink)) Старый
Rius Rius вне форума
Программист
 
Аватар для Rius
 
Сообщений: 7,457
Сказал(а) спасибо: 22
Поблагодарили 944 раз(а) в 928 сообщениях
Регистрация: 27.08.2004
Адрес: Russian Federation
По умолчанию 03.01.2015, 12:45

Событие изменения выбранного элемента: QTableView::selectionModel()::currentChanged()[signal].
Обработчик двойного клика: QTableView::mouseDoubleClickEvent(QMouseEvent *).
Перевод координат в индекс модели: QTableView::indexAt(const QPoint &) const : QModelIndex.
Ответить с цитированием
Пользователь сказал cпасибо:
Lexflax (03.01.2015)
  (#3 (permalink)) Старый
Lexflax Lexflax вне форума
Member
 
Сообщений: 92
Сказал(а) спасибо: 35
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.04.2011
По умолчанию 03.01.2015, 13:21

Спасибо все работает, нужное окно вызывается... Появился другой нюанс...

мне нужно по 2 щелчку вызывать 5 разных окон, в зависимости от того какие данные сейчас загружены в tableview.
Если загружены данные о возвратах то будет вызвано окно для редактирования возвратов, если загружены расходные накладные то будет вызвано окно для редактирования расходных накладных.
Сейчас естественно при любой загрузке вызывается одно и тоже окно...
Данные загружаются после выбора в combobox
cpp Код:
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);
}

Можно как то связь эту установить чтоб учитывалось из какой таблицы сейчас выгружены данные, и тогда после двойного клика вызывалось нужное окно.
cpp Код:
void MainWindow::insertRecord(){
      Prosmotrrashodnakladnih *prosmotrnakladnih = new Prosmotrrashodnakladnih;
      prosmotrnakladnih->show();
}
вот сейчас вызывается 2 формы , вместо определенной одной...

cpp Код:
void MainWindow::insertRecord(){
      Prosmotrrashodnakladnih *prosmotrnakladnih = new Prosmotrrashodnakladnih;
      prosmotrnakladnih->show();
 
      ProsmotrVozvratov *prosmotrvozvratov = new ProsmotrVozvratov;
      prosmotrvozvratov->show();
}
Ответить с цитированием
  (#4 (permalink)) Старый
Rius Rius вне форума
Программист
 
Аватар для Rius
 
Сообщений: 7,457
Сказал(а) спасибо: 22
Поблагодарили 944 раз(а) в 928 сообщениях
Регистрация: 27.08.2004
Адрес: Russian Federation
По умолчанию 03.01.2015, 13:30

Вы же данные загружаете сами? Запоминайте их источник, и в соответствии с этим вызывайте нужную форму. Это не проблема Qt.
Ответить с цитированием
Пользователь сказал cпасибо:
Lexflax (03.01.2015)
  (#5 (permalink)) Старый
Lexflax Lexflax вне форума
Member
 
Сообщений: 92
Сказал(а) спасибо: 35
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.04.2011
По умолчанию 03.01.2015, 16:16

Как запомнить источник данных?
Я наверно не правильно проблему описал.
Один компонент tableview на форме.
В комбобоксе пользователь выбирает какие сейчас данные он хочет увидеть, хочешь увидеть расходные накладные, или возвраты или приходные накладные...
Выбрал пользователь расходные накладные, отобразились они в tableview, двойной клик по любой накладной загрузилось окно для редактирования именно расходные накладных.
Выбрал он возвратные накладные , загрузились в tableview возвраты, двойной клип по возврату загрузилось окно именно для редактирования возвратов.
тоесть на каждый выбор в комбобоксе после двойного щелчка в tableview должно вызываться своя форма редактирования.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Rius Rius вне форума
Программист
 
Аватар для Rius
 
Сообщений: 7,457
Сказал(а) спасибо: 22
Поблагодарили 944 раз(а) в 928 сообщениях
Регистрация: 27.08.2004
Адрес: Russian Federation
По умолчанию 03.01.2015, 17:06

Правильно описали.
Цитата:
Сообщение от Lexflax Посмотреть сообщение
В комбобоксе пользователь выбирает какие сейчас данные он хочет увидеть, хочешь увидеть расходные накладные, или возвраты или приходные накладные...
Тут надо запомнить, что за данные выводятся. А потом, имея это знание, предоставлять нужное окно редактирования по двойному клику.

Последний раз редактировалось Rius; 03.01.2015 в 17:32
Ответить с цитированием
Пользователь сказал cпасибо:
Lexflax (03.01.2015)
  (#7 (permalink)) Старый
Lexflax Lexflax вне форума
Member
 
Сообщений: 92
Сказал(а) спасибо: 35
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.04.2011
По умолчанию 03.01.2015, 17:33

Да теоретически я это понимаю, я практически не знаю как это реализовать.
Ответить с цитированием
  (#8 (permalink)) Старый
Lexflax Lexflax вне форума
Member
 
Сообщений: 92
Сказал(а) спасибо: 35
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.04.2011
По умолчанию 03.01.2015, 17:39

Сижу думаю но как программно реализовать это не знаю(
cpp Код:
#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();
}
Ответить с цитированием
  (#9 (permalink)) Старый
Rius Rius вне форума
Программист
 
Аватар для Rius
 
Сообщений: 7,457
Сказал(а) спасибо: 22
Поблагодарили 944 раз(а) в 928 сообщениях
Регистрация: 27.08.2004
Адрес: Russian Federation
По умолчанию 03.01.2015, 17:51

В echoChanged() сохраняем индекс в переменную класса.
В insertRecord() через switch, например, вызываем нужный диалог.
Ответить с цитированием
  (#10 (permalink)) Старый
Lexflax Lexflax вне форума
Member
 
Сообщений: 92
Сказал(а) спасибо: 35
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.04.2011
По умолчанию 04.01.2015, 11:25

Добавил переменную класса, переменная nomer.
через if все работает.
cpp Код:
void MainWindow::insertRecord(){
    if (nomer==0){
 
 
      Prosmotrrashodnakladnih *prosmotrnakladnih = new Prosmotrrashodnakladnih;
      prosmotrnakladnih->show();}
    else {
 
 
      ProsmotrVozvratov *prosmotrvozvratov = new ProsmotrVozvratov;
      prosmotrvozvratov->show();
 
    }
}

Не получается сделать через switch сделать

cpp Код:
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;  }
 
}
пишет ошибки
cpp Код:
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;
                                  ^
в чем проблема можно как то через switch сделать?
Ответить с цитированием
  (#11 (permalink)) Старый
Rius Rius вне форума
Программист
 
Аватар для Rius
 
Сообщений: 7,457
Сказал(а) спасибо: 22
Поблагодарили 944 раз(а) в 928 сообщениях
Регистрация: 27.08.2004
Адрес: Russian Federation
По умолчанию 04.01.2015, 11:26

cpp Код:
switch (nomer) {
    case 0: {
      Prosmotrrashodnakladnih *prosmotrnakladnih = new Prosmotrrashodnakladnih;
      prosmotrnakladnih->exec();
      delete *prosmotrnakladnih;
      break;
    }
    case 1: {
      ...
      break;
    }
    case 2: {
      ...
      break;
    }
}

Или
cpp Код:
case 0: {
      Prosmotrrashodnakladnih prosmotrnakladnih;
      prosmotrnakladnih.exec();
      break;
    }

Последний раз редактировалось Rius; 04.01.2015 в 11:31
Ответить с цитированием
  (#12 (permalink)) Старый
Lexflax Lexflax вне форума
Member
 
Сообщений: 92
Сказал(а) спасибо: 35
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.04.2011
По умолчанию 04.01.2015, 14:11

cpp Код:
void MainWindow::insertRecord()
{

    switch (nomer) {
        case 0: {
          Prosmotrrashodnakladnih *prosmotrnakladnih = new Prosmotrrashodnakladnih;
          prosmotrnakladnih->show();
          delete prosmotrnakladnih;
          break;
        }
          case 1:    {

          ProsmotrVozvratov *prosmotrvozvratov = new ProsmotrVozvratov;
          prosmotrvozvratov->show();
          delete prosmotrvozvratov;
          break;
              }
                   }

}

В обоих случая окно сразу закрывается после вызова, просто моргнет на мили секунду и исчезает(
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Rius Rius вне форума
Программист
 
Аватар для Rius
 
Сообщений: 7,457
Сказал(а) спасибо: 22
Поблагодарили 944 раз(а) в 928 сообщениях
Регистрация: 27.08.2004
Адрес: Russian Federation
По умолчанию 04.01.2015, 14:51

См. выше!
prosmotrnakladnih->exec();

show() показывает контрол и идёт дальше, а exec показывает и ждёт закрытия, останавливаясь.
Найдите книгу Qt 4.8. Профессиональное программирование на C++ - Макс Шлее, прочитайте и такие вопросы отпадут.
Ответить с цитированием
  (#14 (permalink)) Старый
Lexflax Lexflax вне форума
Member
 
Сообщений: 92
Сказал(а) спасибо: 35
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.04.2011
По умолчанию 04.01.2015, 15:45

Я первоначально его попробовал но с ним вообще ошибку выдает...
cpp Код:
C:\tt\lesson\one\mainwindow.cpp:117: ошибка: 'class Prosmotrrashodnakladnih' has no member named 'exec'
           prosmotrnakladnih->exec();
cpp Код:
void MainWindow::insertRecord()
{

    switch (nomer) {
        case 0: {
          Prosmotrrashodnakladnih *prosmotrnakladnih = new Prosmotrrashodnakladnih;
          prosmotrnakladnih->exec();
          delete prosmotrnakladnih;
          break;
        }
          case 1:    {

          ProsmotrVozvratov *prosmotrvozvratov = new ProsmotrVozvratov;
          prosmotrvozvratov->exec();
          delete prosmotrvozvratov;
          break;
              }
                   }

}
^
Ответить с цитированием
  (#15 (permalink)) Старый
Rius Rius вне форума
Программист
 
Аватар для Rius
 
Сообщений: 7,457
Сказал(а) спасибо: 22
Поблагодарили 944 раз(а) в 928 сообщениях
Регистрация: 27.08.2004
Адрес: Russian Federation
По умолчанию 04.01.2015, 15:48

А Prosmotrrashodnakladnih это не диалог чтоль? От чего унаследовано?
Ответить с цитированием
Пользователь сказал cпасибо:
Lexflax (17.01.2015)
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
После замены дисковода нет сигнала на монитор андрей75 Любые вопросы от новичков 2 17.02.2014 02:10
Комп выключается после выбора загрузки, что делать? BAHO Техническая поддержка 19 14.08.2012 18:21
Нет сигнала после режима POST 024625 Любые вопросы от новичков 4 28.04.2010 00:14
Получение определенного числа после запятой Aziz C++ Builder 7 10.04.2010 00:19
BIOS после включения издаеттри коротких сигнала. SerGrey Техническая поддержка 26 05.12.2008 13:48
Получение параметров коммандной строки Niagen Prolog 8 15.02.2008 17:52
Нет сигнала на видеокарту после начала загрузки WINDOWS. alex2007 Техническая поддержка 7 21.06.2007 21:32
Получение и вывод на экран строки в TASM Zar Вопросы начинающих программистов 6 30.11.2006 22:32
Получение параметров командной строки Джо Delphi 2 28.07.2004 18:59
Получение командной строки по хэндлу окна Lili WinAPI 2 20.07.2004 16:44
Как сделать что бы событие происходило в момент выбора строки в ComboBox Anonymous Visual C++ 1 22.11.2003 22:39
Нужно, чтобы в списке после загрузки страницы не было выбора по умолчанию Anonymous DHTML, JavaScript, VBScript 1 14.11.2003 15:00



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов