Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QTable, мучаюсь с заголовком столбцов.. QT3.. 
:(
    Опции темы
Kurt
Дата 9.7.2005, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



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)

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  0.jpg 6,26 Kb


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Kurt
Дата 9.7.2005, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



2)

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  1.jpg 4,64 Kb


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Mayk
Дата 9.7.2005, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 5
Всего: 134



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

box = new QVBoxLayout(layout());

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


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Kurt
Дата 9.7.2005, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



Цитата
На рисунке виден MenuBar, в коде нет

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

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

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

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


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
S.A.P.
Дата 9.7.2005, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 1
Всего: 71



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

Это сообщение отредактировал(а) Perchilla - 9.7.2005, 15:33
PM MAIL   Вверх
Mayk
Дата 9.7.2005, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 5
Всего: 134



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

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

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



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Kurt
Дата 9.7.2005, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



Блин, без 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;
}



--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Mayk
Дата 9.7.2005, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 5
Всего: 134



Одназначно вопрос на 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();
}



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Kurt
Дата 9.7.2005, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



Что-то не то..
Наследовался от 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


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
DrLazy
Дата 9.7.2005, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 8.7.2005

Репутация: нет
Всего: нет



Оффтопик конечно, но вот именно из за таких затыков и не использую "стандартные" библиотеки классов.
PM   Вверх
Mayk
Дата 10.7.2005, 05:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 5
Всего: 134



Kurt
Цитата(Kurt @ 9.7.2005, 22:40)
_menuBar = new QMenuBar(this);

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

Это сообщение отредактировал(а) Mayk - 10.7.2005, 05:30


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Kurt
Дата 10.7.2005, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



Понял. Благодарю.
Все заработало.
smile

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


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Kurt
Дата 11.7.2005, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



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


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Mayk
Дата 11.7.2005, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 5
Всего: 134



Цитата(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 создавать.

Это сообщение отредактировал(а) Mayk - 11.7.2005, 20:06


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Kurt
Дата 11.7.2005, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



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


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0607 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.