Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > QTable, мучаюсь с заголовком столбцов..


Автор: Kurt 9.7.2005, 01:47
Qt3. Пытаюсь разобраться с QTable.
Создаю так (в конструкторе виджета):
Код

QVBoxLayout *box;

QTable *table;
...
box = new QVBoxLayout(this);
table = new QTable(10, 2, this);

table->setSelectionMode(QTable::SingleRow);

table->setReadOnly(TRUE);
table->setTopMargin(50);

table->horizontalHeader()->setLabel(0, "c1");

table->horizontalHeader()->setLabel(1, "c2");

box->addWidget(table);

Возникает проблемка с заголовками столбцов - я устанавливаю довольно большую высоту заголовка (50!), но названия все равно отрисовываются где-то там сверху (см. первый файл). И лишь когда я ставлю высоту хедера в 70 пикселей, он наконец-то соизволяет отобразиться, но при этом куча места под лейблом заголовка. (см. 2-й файл).
Подскажите, что я делаю не так? Мне нужен обычный заголовок, чтоб лейблы влезали, а сам заголовок был чуть больше, чем надписи, к-е он содержит. Как убрать этот отступ снизу?

1)

Автор: Kurt 9.7.2005, 01:49
2)

Автор: Mayk 9.7.2005, 07:14
На рисунке виден MenuBar, в коде нет.
Если создаваемый виджет наследуется от QMainWindow, то замени 5ую строку на
Код

box = new QVBoxLayout(layout());

Если таблица и иже с ней являются отдельным виджетом то смотри как этот самый виджет размещается.

Автор: Kurt 9.7.2005, 15:10
Цитата
На рисунке виден MenuBar, в коде нет

Я не думал, что в данном случае это важно.

Цитата
Если создаваемый виджет наследуется от QMainWindow..

Нет, я наследуюсь просто от QWidget.
Добавлено @ 15:17
Кстати, QMenuBar тоже следует добавлять в QVBoxLayout? Или это не обязательно?
Я хочу, чтоб виджеты на форме располагались в один столбец - пока тут просто таблица (т.е. один виджет), но дальше будет хуже.. ээ.. т.е. лучше. smile

Хотя пофиг, я и так и так пробовал - без изменений. smile

Автор: S.A.P. 9.7.2005, 15:33
Попробуй для начала просто грубо вызвать setGeometry, сделать таблицу чуть пониже, может меню на заголовок заезжает...

Автор: Mayk 9.7.2005, 16:00
Цитата(Kurt @ 9.7.2005, 16:10)
Нет, я наследуюсь просто от QWidget.

Ага, допёрло. Никаких QDialog'ов и QMainWindow'ов нет...
Цитата(Kurt @ 9.7.2005, 16:10)
Кстати, QMenuBar тоже следует добавлять в QVBoxLayout? Или это не обязательно?

Обязательно. Иначе у тебя два виджета ложатся на координату (0,0).

Автор: Kurt 9.7.2005, 16:27
Блин, без MenuBar'а все ОК. Пытаюсь понять почему..
Кому интересно, вот полный код имплементации моего класса MainWindow (сделан специально для тестов smile). Переменные восном объявлены в соотв. хедере класса, но думаю и без этого все ясно:
Код

#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent, const char *name)

        : QWidget(parent, name)
{
    setGeometry(100, 100, 300, 200);
    setCaption("Test!");
    box = new QVBoxLayout(this);
    _createMenuBar();  //если закомментировать эту строчку - все ОК!
    _createTable();
    return;
}

void MainWindow::_createMenuBar()
{
    _menuBar = new QMenuBar(this);
    _fileMenu = new QPopupMenu();
    _fileMenu->insertItem("Some item");
    _fileMenu->insertSeparator();
    _fileMenu->insertItem("&Quit", qApp, SLOT(quit()), CTRL+Key_Q );
    _menuBar->insertItem("File", _fileMenu);
    box->addWidget(_menuBar);
    return;
}

void MainWindow::_createTable()
{
    table = new QTable(10, 2, this);
    table->setSelectionMode(QTable::SingleRow);
    table->setReadOnly(TRUE);
    table->setTopMargin(50); //для Windows это значение должно быть поменьше (чтоб увидеть мою проблемку). Где-то 20.
    table->horizontalHeader()->setLabel(0, "c1");
    table->horizontalHeader()->setLabel(1, "c2");
    box->addWidget(table);
    return;
}

Автор: Mayk 9.7.2005, 17:57
Одназначно вопрос на 5. Такое ощущение, что QT использует заголовок окна как часть своего виджета.
Зато если заменить setGeomertry() на setMinimumSize(300,200); move(100,100) всё работает smile.
А вообще используй QMainWindow, чтоб не мучаться smile
Изменения:
Код

void clMainWindow::_createMenuBar()
{
    _menuBar = menuBar(); 
    /*skip*/
    //box->addWidget(_menuBar);   
}   
clMainWindow::clMainWindow() : QMainWindow(0,0)
{
    setGeometry(100, 100, 300, 200);
    setCaption("Test!");
    _createMenuBar();
    box = new QVBoxLayout(layout()); //menuBar() сам создает Layout
    _createTable();
}

Автор: Kurt 9.7.2005, 21:40
Что-то не то..
Наследовался от QMainWindow, сделал изменения, что ты указал. В итоге при запуске получаю:
Цитата
Segmentation fault


Вот код, с к-м эксперементирую:
Код

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent, const char *name)
        : QMainWindow(0,0)
{
    setGeometry(100, 100, 300, 200);
    setCaption("Test!");
    _createMenuBar();
    box = new QVBoxLayout(layout());
    _createTable();

    return;
}

void MainWindow::_createMenuBar()
{
    _menuBar = new QMenuBar(this);
    _fileMenu = new QPopupMenu();
    _fileMenu->insertItem("Some item");
    _fileMenu->insertSeparator();
    _fileMenu->insertItem("&Quit", qApp, SLOT(quit()), CTRL+Key_Q );
    _menuBar->insertItem("File", _fileMenu);
    //box->addWidget(_menuBar);
    return;
}

void MainWindow::_createTable()
{
    table = new QTable(10, 2, this);
    table->setSelectionMode(QTable::SingleRow);
    table->setReadOnly(TRUE);
    table->setTopMargin(50);
    table->horizontalHeader()->setLabel(0, "c1");
    table->horizontalHeader()->setLabel(1, "c2");
    box->addWidget(table);
    return;
}


Причем, если строчку
Код
box = new QVBoxLayout(layout());

меняю на
Код
box = new QVBoxLayout(this);

приложение запускается (с тем же траблом, что и послужил темой топика!), но вдобавок в терминале выводит:
Цитата
[QLayout "unnamed" added to MainWindow "unnamed", which already has a layout


Сейчас буду пробовать вариант с setMinimumSize() и move(), но как-то.. хм.. как минимум, некрасиво. smile
Добавлено @ 21:48
Проверил. C setMinimumSize() и move() работает, но только для QWidget - для QMainWindow все тот же баг. smile

Автор: DrLazy 9.7.2005, 22:27
Оффтопик конечно, но вот именно из за таких затыков и не использую "стандартные" библиотеки классов.

Автор: Mayk 10.7.2005, 05:30
Kurt
Цитата(Kurt @ 9.7.2005, 22:40)
_menuBar = new QMenuBar(this);

Вот это замени на _menuBar=menuBar().

Автор: Kurt 10.7.2005, 10:02
Понял. Благодарю.
Все заработало.
smile

Хотя все же интересно с QWidget получилось..

Автор: Kurt 11.7.2005, 18:33
Не хочу ради этого создавать новый топик...
Вот я добавил таблицу на QMainWindow. А как сделать, чтоб при изменении размеров окна таблица тоже изменялась? А то сейчас у нее статические размеры.
Я думал, что этим как раз и занимается QVBoxLayout. Или тут нужен другой layout?
Или надо какой-то сигнал обработать?

Автор: Mayk 11.7.2005, 20:04
Цитата(Kurt @ 11.7.2005, 19:33)
А то сейчас у нее статические размеры.

smile Вот те на. Мне казалось будут менятся... Видать у QT есть своё мнение на этот счет smile Тогда делаем вообще правильно:
box=layout() выкидываем за ненадобностью.
Цитата(Kurt @ 9.7.2005, 22:40)
box->addWidget(table);

Вот это заменяем на setCentralWidget(table). Теперь таблица стоит центральным виджетом и ресайзится на ура. Это плюс.
Если делать на вырост, то можно создать QVBox, запихнуть в него Table, прочую ерунду и QVBox сделать центральным виджетом.
Или альтернативный вариант - сделать новый класс MainWidget от QWidget'а, в нём делать что угодно, и запихать этот класс в MainWindow.
А вот все эти телодвижения по созданию классов имхо минус... Особенно если MainWidget создавать.

Автор: Kurt 11.7.2005, 20:16
Qt у меня сейчас нет (я не со своего компа пишу), но уточни - QVBoxLayout ВООБЩЕ убрать?

Автор: Mayk 11.7.2005, 21:06
Да. Он более не нужен.

Автор: Kurt 12.7.2005, 00:08
Все работает в лучшем виде! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)