Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не могу получить текущую выделенную строку
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
RazrFalcon
.cpp
#include "mainwindow.h"
MainWindow::MainWindow()
{
    table = new tableWidget(this);
    table->setColumnCount(14);
    table->setRowCount(50);
    table->setSelectionBehavior(QAbstractItemView::SelectRows);

    setCentralWidget(table);

    connect(table,SIGNAL(cellClicked(int,int)),this,SLOT(on_cellClicked(int,int)));

    setMinimumSize(800,650);
}

void MainWindow::on_cellClicked(int row,int)
{
    qDebug()<<row;
    qDebug()<<"From MainWindow class"<<table->currentRow();
}

void MainWindow::on_currentRowIndexChanged(int row)
{
    qDebug()<<"From currentRowIndexChanged func"<<table->currentRow();
}

void tableWidget::keyPressEvent(QKeyEvent *event)
{
    MainWindow my;
    qDebug()<<my.table->rowCount();
    qDebug()<<"From tableWidget class"<<my.table->currentRow();
    my.table->setRowCount(600);
    my.on_currentRowIndexChanged(1);

    QTableWidget::keyPressEvent(event);
}
.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtGui>
#include <QtDebug>

class tableWidget : public QTableWidget
{
    Q_OBJECT

public:
    tableWidget(QWidget* parent = 0) {}
    void keyPressEvent(QKeyEvent *event);
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow();
    tableWidget *table;

public slots:
    void on_cellClicked(int row,int col);
    void on_currentRowIndexChanged(int row);
};
#endif // MAINWINDOW_H


Вывод консоли:
При клике:
6 
From MainWindow class 6

При нажатии клавиши:
50 
From tableWidget class -1
From currentRowIndexChanged func -1


Задача: получить номер текущей выделенной строки и передать ее в on_cellClicked
abc
ты создал окно в KeyPressed, но никакую строку, конечно, не выделил, и currentRow возвращает -1 за неимением текущей строки
а onCellClicked сама даёт тебе номер строки, в чём недопонимание? моё или твоё?)
RazrFalcon
onCellClicked - говорит само за себя, а мне нужно получать номер строки при использовании клавиш вниз и вверх. Для этого использовал класс перехвата нажатий клавиатуры. Он понимает что я нажал вниз, выделение спустилось на одну строку ниже, а индекс -1. Вот в чем проблема.
abc
Объясни, что у тебя делает
MainWindow my;
в tableWidget::keyPressEvent?
RazrFalcon
Так я пытался обратится к таблице. Она в MainWindow определена и используется.
abc
Таблице ничего не нужно знать о MainWindow
Слот изменяющий строку должен быть методом класса таблицы, не MainWindow
RazrFalcon
Цитата(abc @ 11.3.2011, 23:04) *
Слот изменяющий строку должен быть методом класса таблицы, не MainWindow

А можно пример кода, а то я ничего не понял. <_<
abc
Это я ничего не понял) Только что создал окошко, посадил туда таблицу. При нажатиях клавиш, выделение двигается - остаётся только соединить сигнал
void currentCellChanged ( int currentRow, int currentColumn, int previousRow, int previousColumn )
со своим слотом,
и ты в этом слоте получишь все эти значения:
int currentRow, int currentColumn, int previousRow, int previousColumn

не нужно тебе наследование от QTableWidget и KeyPressEvent


Ну, и поясню, что я до этого городил.
Если у тебя есть класс А, член класса Б, то ты не можешь нуждаться в методах класса Б в классе А. Б использует А, а не наоборот. Жутко формулирую?( Тем более ты не можешь создавать в А объект Б! У тебя это чудом вышло - потому что оба класса разрабатываются в одном файле. А если бы было два заголовочника, и ты бы их друг в друге заинклудил, то компилятор бы с тобой поговорил) Ты дошёл до жизни такой, видимо, потому, что нуждался в слоте on_currentRowIndexChanged() из класса MainWindow, но на самом деле это не так.

И в любом случае ты неверно работал в keyPressEvent(QKeyEvent *event).
Ты не использовал переменную event, а значит обрабатывал нажатия на любые клавиши. А суть этого метода в том, чтобы получить нажатие конкретной клавиши, и это нажатие оригинально обработать.
RazrFalcon
ппц, это просто эпикфэйл!
Спасибо, разобрался!
abc
я там подправил кое-что, перечитай :) сижу тут правлю формулирую уже полчаса, не зная, какой аспект фэйла и осветить-то))
RazrFalcon
Цитата(abc @ 11.3.2011, 23:20) *
void currentCellChanged ( int currentRow, int currentColumn, int previousRow, int previousColumn )

вот так я решил свою проблему, класс tableWidget удалил вообще.


Цитата(abc @ 11.3.2011, 23:20) *
Ну, и поясню, что я до этого городил.
Если у тебя есть класс А, член класса Б, то ты не можешь нуждаться в методах класса Б в классе А. Б использует А, а не наоборот. Жутко формулирую?( Тем более ты не можешь создавать в А объект Б! У тебя это чудом вышло - потому что оба класса разрабатываются в одном файле. А если бы было два заголовочника, и ты бы их друг в друге заинклудил, то компилятор бы с тобой поговорил) Ты дошёл до жизни такой, видимо, потому, что нуждался в слоте on_currentRowIndexChanged() из класса MainWindow, но на самом деле это не так.

И в любом случае ты неверно работал в keyPressEvent(QKeyEvent *event).
Ты не использовал переменную event, а значит обрабатывал нажатия на любые клавиши. А суть этого метода в том, чтобы получить нажатие конкретной клавиши, и это нажатие оригинально обработать.

Конкретные клавиши я обрабатывал сначала, но толку было столько же, по этому сделал что бы на любую реагировало.
Я уже и сам, вроде, понял, что намудрил с классами.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.