Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: добавить ряд, столбец в таблицу
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
kvak
Здравствуйте. Имеется таблица (с ней все понятно) из книги по qt.

#include <QtGui>

// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
    const int n = 3;

    QApplication      app(argc, argv);
    QTableWidget      tbl(n, n);
    QTableWidgetItem* ptwi = 0;
    QStringList       lst;

    lst << "First" << "Second" << "Third";
    tbl.setHorizontalHeaderLabels(lst);
    tbl.setVerticalHeaderLabels(lst);

    for (int i  = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            ptwi = new QTableWidgetItem(QString("%1,%2").arg(i).arg(j));
            tbl.setItem(i, j, ptwi);
        }
    }
    tbl.resize(350, 125);
    tbl.show();

    return app.exec();
}


Подскажите, как мне добавить новый ряд в эту таблицу, с заголовком (имеется ввиду заголовок, который делался методом setHorizontalHeaderLabels.


RazrFalcon
tbl.insertRow(int);
tbl.insertColumn(int);

tbl.setHorizontalHeaderItem(int, new QTableWidgetItem(tr("name")));
tbl.setVerticalHeaderItem(int, new QTableWidgetItem(tr("name")));

это для названий
kvak
Спасибо ;)
Не знал еще, что можно сразу в аргумент функции записывать new QTableWidgetItem без его объявления.
А что такое tr ?
А то у меня с ним не компиллировалось.
RazrFalcon
Цитата(kvak @ 26.8.2010, 23:25) *
А что такое tr ?

translate(перевод), ну это для QT Creator, я так понял вы на VS, там это вряд ли нужно.
ufna
а чей это tr() только для Креатора то стал? О_о

в данном контексте делай QObject::tr(..)
Litkevich Yuriy
Цитата(kvak @ 27.8.2010, 3:25) *
в аргумент функции записывать new QTableWidgetItem без его объявления.
оператор new возвращает указатель, полистай книжки по Си++.

и таки ufna хороший вопрос задал, насчёт tr(), следует про этот tr() почитать
kvak
Интересует еще одна вещь. Как в созданной таблице задать высоту ряда и ширину определенной колонки. В самом классе QTableWidget таких методов нет. Подскажите, кто знает.
kvak
И еще такой вопросик. Почему у меня после компиляции не открывается программа. Это из-за того, что я пытаюсь вставить в таблицу виджет. Не понимаю в чем ошибка.

#include <QtGui>

// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
    const int n = 3;

    QApplication      app(argc, argv);
    QTableWidget      tbl(n, n);
    QTableWidgetItem* ptwi = 0;
    QStringList       lst;

    lst << "First" << "Second" << "Third";
    tbl.setHorizontalHeaderLabels(lst);
    tbl.setVerticalHeaderLabels(lst);

    for (int i  = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            ptwi = new QTableWidgetItem(QString("%1,%2").arg(i).arg(j));
            tbl.setItem(i, j, ptwi);
        }
    }
    
    tbl.insertRow(3);
    tbl.setVerticalHeaderItem(3, new QTableWidgetItem("Fourth"));
    

   QComboBox *bbb;                                 // из-за этого не открывается программа, хотя      
   tbl.setCellWidget(3, 2, bbb);                   // компилируется                  

    
    tbl.resize(350, 125);
    tbl.show();

    return app.exec();
}


Алексей1153
Цитата
QComboBox *bbb; // из-за этого не открывается программа, хотя
tbl.setCellWidget(3, 2, bbb); // компилируется


знаешь про Буратино и яблоки ? :)

Цитата
Буратино дали три яблока. Два он съел. Сколько яблок осталось у Буратино? Думаете одно? Ничего подобного. Никто не знает сколько у него уже было яблок до этого. Мораль: всегда инициализируй переменные!
ufna
Про яблоки - супер. Не знал загадку такую :)
kvak
Так в чем ошибка-то ?
Алексей1153
kvak, ты объявляешь указатель

QComboBox *bbb;


то, что ты забыл создать сам указуемый объект (или хотел не сейчас) - так обнули хотя бы указатель

Цитата
QComboBox *bbb=0;


а если хочешь создать, то создавай
Цитата
QComboBox *bbb=new QComboBox(this);


Думал, после намёка всё станет понятно ))
kvak
Да блин. Забыл, что указатель никуда не указывающий ничего не дает. Я просто очень редко программирую под свои нужды. Вот счас понадобились таблицы. А не вкурсе как все-таки установить фиксированную высоту ряда и ширину колонки ? Может быть как-то через методы класса QTableView. Но как ?
Алексей1153
в справке есть
Цитата
void QTableView::setColumnWidth ( int column, int width )
Sets the width of the given column to be width.
This function was introduced in Qt 4.1.
See also columnWidth().


void QTableView::setRowHeight ( int row, int height )
Sets the height of the given row to be height.
This function was introduced in Qt 4.1.
See also rowHeight().

сам я не пробовал :) Но врать вряд ли будут
kvak
Да. Но у меня класс то QTableWidget. Я догадываюсь, что можно использовать методы класса QTableView, но как именно не знаю.
Алексей1153
Цитата
Inherits QTableView.

да так же, как и обычно

QTableWidget p* =new QTableWidget(...);
p->setColumnWidth (...);



Litkevich Yuriy
Цитата(kvak @ 29.8.2010, 15:57) *
Я догадываюсь, что можно использовать методы класса QTableView, но как именно не знаю.
методы базового класса наследуются дочерним классом, т.е. как бы "становятся методами дочернего".
kvak
Классно :rolleyes:
kvak
Появился еше один вопрос. Много пробовал, но не смог понять.

connect(TAB, SIGNAL(itemDoubleClicked(myitem)), this, SLOT(OPEN_PRODUCT()));


TAB - это моя таблица, объект класса QTableWidget
OPEN_PRODUCT() - мой слот

Требуется, чтобы myitem указывал на ячейку с координатами (0,0) , чтобы при двойном клике по ней вызывался мой слот. Не получается это сделать. Если кто знает как, подскажите пожалуйста.
molchanoviv
Цитата
connect(TAB, SIGNAL(itemDoubleClicked(myitem)), this, SLOT(OPEN_PRODUCT()));

Во первых вместо myitem должен стоять тип, во вторых в слоте от тоже должен быть указан. А вообще просто с помощью emit вызывай свой сигнал и все.
kvak
Цитата(molchanoviv @ 30.8.2010, 22:57) *
Цитата
connect(TAB, SIGNAL(itemDoubleClicked(myitem)), this, SLOT(OPEN_PRODUCT()));

Во первых вместо myitem должен стоять тип, во вторых в слоте от тоже должен быть указан. А вообще просто с помощью emit вызывай свой сигнал и все.


Я как понял, что в аргумент сигнала нужно передать указатель на объект класса QTableWidgetItem.
Но я не знаю, как создать сам объект типа QTableWidgetItem, чтобы он принадлежал определенной ячейке в таблице.
По-другому не предсталяю как. Если не сложно, напишите сам код.
kvak
Все, понял как. Вот так сигнал высылается и слот открывается, когда кликаешь 2 раза по любой ячейке
connect(TAB, SIGNAL(itemDoubleClicked(QTableWidgetItem *)), SLOT(OPEN_PRODUCT()));

Осталось только понять, можно ли сделать так, чтобы сигнал высылался, когда кликаешь по только по определенной колонке.
molchanoviv
Цитата(kvak @ 31.8.2010, 21:19) *
connect(TAB, SIGNAL(itemDoubleClicked(QTableWidgetItem *)), SLOT(OPEN_PRODUCT()));


Не совсем так. правильно писать connect(TAB, SIGNAL(itemDoubleClicked(QTableWidgetItem *)), SLOT(OPEN_PRODUCT(QTableWidgetItem *)));

Цитата(kvak @ 31.8.2010, 21:19) *
Осталось только понять, можно ли сделать так, чтобы сигнал высылался, когда кликаешь по только по определенной колонке.


Ну так обрабатывай нажатия вручную и если клик произошел по той колонке с помощью emit вызывай свой сигнал. Т.Е. в *.h файле опиши свой сигнал. signals: void mySignal(QTableWidgetItem *), затем в *.cpp соединяй свой сигнал со слотом OPEN_PRODUCT(QTableWidgetItem *) а сигнал itemDoubleClicked со слотом в котором ты вяснишь туда ли произошел клик и если да, то вызывай сигнал с помощью emit mySignal(QTableWidgetItem *). Код не пишу намеренно, чтобы ты мог разобраться сам.
kvak
Спасибо, я уже понял про сигнал. А чтобы обрабатывать сигналы только с нужной колонки я воспользовался встроенными методами.

connect(TAB, SIGNAL(itemDoubleClicked(QTableWidgetItem *)), SLOT(OPEN_PRODUCT(QTableWidgetItem *)));

OPEN_PRODUCT(QTableWidgetItem *checkitem) {

int colonna = checkitem->column();
if(colonna == 0){
//нужный код
}
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.