Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: qtист от Март 04, 2009, 18:10



Название: О QTableWidget
Отправлено: qtист от Март 04, 2009, 18:10
Перехожу потихоньку с MFC на QT - тяжко :'( ,
может и стану кютеистом.

Вопрос такой:
cоздал форму с QTableWidget.
Надо бы сделать ввод ,например,только цифр и запятой.
Получается или любые символы,или только цифры.




Название: Re: О QTableWidget
Отправлено: pastor от Март 04, 2009, 18:25
Нужно создать свой делегат на основе QItemDelegate и установить его для таблицы при помощи setItemDelegate(...).

См .пример QTDIR/examples/itemviews/spinboxdelegate/

Тебе нужно переопределить один метод - createEditor, создать редактор ячеек (QLineEdit), установить нужную маску ввода:

Код
C++ (Qt)
QWidget *YourDelegate::createEditor(QWidget *parent,
   const QStyleOptionViewItem &/* option */,
   const QModelIndex &/* index */) const
{
   QLineEdit *editor = new QLineEdit(parent);
   editor->setInputMask("bla-bla-bla");
   return editor;
}


Название: Re: О QTableWidget
Отправлено: KADABRA от Март 04, 2009, 21:21
... установить нужную маску ввода:

Код
C++ (Qt)
...
   editor->setInputMask("bla-bla-bla");
...
Правильнее validator:
Код
C++ (Qt)
editor->setValidator(new QDoubleValidator(editor));


Название: Re: О QTableWidget
Отправлено: qtист от Март 05, 2009, 11:07
Получилось,всем +1. ;D

а вот ещё один маленький вопрос по QTabWidget:

как убрать выделение элемента из таблицы,когда таблица теряет фокус?


Название: Re: О QTableWidget
Отправлено: spirit от Март 05, 2009, 11:17
см. void QAbstractItemView::clearSelection () & QFocusEvent.


Название: Re: О QTableWidget
Отправлено: Maquefel от Апрель 16, 2009, 11:19
Не получаеться - пустые ячейки вставляет  :'( и редактировать не даёт

Код:
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindowClass)
{
    ui->setupUi(this);
    ui->deformationInput->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(ui->deformationInput,
            SIGNAL(customContextMenuRequested(const QPoint &)),
            this,
            SLOT(contexMenu(const QPoint &)));
    tabledelegate tbldelegate;
    ui->deformationInput->setItemDelegate(&tbldelegate);
    createActions();
    createMenus();
}

tableitemdelegate.h
Цитировать
class tabledelegate : public QItemDelegate
{
public:
    tabledelegate(QObject *parent = 0);
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const;
};

tableitemdelegate.cpp
Цитировать
tabledelegate::tabledelegate(QObject *parent)
    : QItemDelegate(parent)
{
}

QWidget *tabledelegate::createEditor(QWidget *parent,    const QStyleOptionViewItem &/* option */,    const QModelIndex &/* index */) const
{
    QLineEdit *editor = new QLineEdit(parent);
    editor->setValidator(new QDoubleValidator(editor));
    editor->setEnabled(true);
    return editor;
}


Название: Re: О QTableWidget
Отправлено: spirit от Апрель 16, 2009, 11:22
попробуй вместо
Код
C++ (Qt)
...
tabledelegate tbldelegate;
ui->deformationInput->setItemDelegate(&tbldelegate);
...
 
вот так сделать
Код
C++ (Qt)
...
ui->deformationInput->setItemDelegate(new tabledelegate);
...
 


Название: Re: О QTableWidget
Отправлено: Maquefel от Апрель 16, 2009, 11:24
Спасибо большое - работает, а в чем дело - если вкратце?


Название: Re: О QTableWidget
Отправлено: spirit от Апрель 16, 2009, 11:26
в том, что ты делегат создаешь в стеке при выходе
из области видимости он удаляется, поэтому его нужно
создавать в куче.