Russian Qt Forum
Апрель 18, 2024, 13:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Изменение стиля QHeaderView в QTableWidget  (Прочитано 11368 раз)
Dimas
Чайник
*
Offline Offline

Сообщений: 50



Просмотр профиля
« : Январь 17, 2012, 10:52 »

Меняю стиль прорисовки таблицы в дизайнере с помощью правки стилей в "Edit Style Sheet".

Пред просмотром (CTRL + ALT + R) получается как мне нужно:


а, при запуске exe получается так:


Вот код стилей:
Цитировать
QTableWidget
{
background-color: rgb(0, 0, 139);
gridline-color: rgb(0, 0, 139);
alternate-background-color: rgb(255, 255, 255);
}

QTableWidget QTableCornerButton::section
{
background-color: rgba(0, 0, 139, 0);
border: 1px outset rgb(0, 0, 139);
}

QHeaderView
{
background-color: rgb(0, 0, 139);
}

QHeaderView::section
{
background-color: rgb(0, 0, 139);
color: rgb(255, 255, 255);
padding-left: 4px;
border:0px outset rgb(0, 0, 0);
}

Из-за чего может не правильно отображаться шапка таблицы?

Тестовый проект прилагаю.

QT 4.5.2. XP

« Последнее редактирование: Январь 17, 2012, 13:00 от Dimas » Записан

qt 4.8.6, qt 5.12.4
Bepec
Гость
« Ответ #1 : Январь 17, 2012, 12:16 »

При запуске, насколько я понял, предпросмотра, используется Qt шное представление.

Когда же ты запускаешь программу, Qt берет оформление у данной системы(которая у тебя сейчас).
Записан
Dimas
Чайник
*
Offline Offline

Сообщений: 50



Просмотр профиля
« Ответ #2 : Январь 17, 2012, 12:58 »

Как решить эту проблему?
Записан

qt 4.8.6, qt 5.12.4
stima
Гость
« Ответ #3 : Январь 17, 2012, 14:01 »

Код:
QHeaderView { color: rgb(255, 255, 255), padding-left: 4px; }
QHeaderView::section { background: transparent; }
Записан
Dimas
Чайник
*
Offline Offline

Сообщений: 50



Просмотр профиля
« Ответ #4 : Январь 17, 2012, 14:20 »

Код:
QHeaderView { color: rgb(255, 255, 255), padding-left: 4px; }
QHeaderView::section { background: transparent; }

Ничего не изменилось. Так же левая колонка рисуется правильно, а верхняя строка (шапка) неправильно.
Записан

qt 4.8.6, qt 5.12.4
stima
Гость
« Ответ #5 : Январь 17, 2012, 15:24 »

Код:
#include <QtGui/QApplication>
#include <QtGui>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QTableWidget v;

    QString SS = "QTableWidget { background: red; } "
                 "QHeaderView { background: transparent; }" //забыл про это
                 "QHeaderView::section { background: transparent; border: 1px solid black; }";

    v.setColumnCount(2);
    v.setStyleSheet(SS);
    v.horizontalHeader()->setStretchLastSection(true);

    v.show();

    return app.exec();
}
« Последнее редактирование: Январь 17, 2012, 15:26 от stima » Записан
Dimas
Чайник
*
Offline Offline

Сообщений: 50



Просмотр профиля
« Ответ #6 : Январь 17, 2012, 21:24 »

Все заработало, если создаю колонки и строки после вызова setStyleSheet. При генерации файла ui_dialog.h из дизайнера setStyleSheet вызывается после создания колонок и строк.

Цитировать
class Ui_Dialog
{
public:
    QTableWidget *tableWidget;

    void setupUi(QDialog *Dialog)
    {
        if (Dialog->objectName().isEmpty())
            Dialog->setObjectName(QString::fromUtf8("Dialog"));
        Dialog->resize(385, 231);
        tableWidget = new QTableWidget(Dialog);
        if (tableWidget->columnCount() < 1)
            tableWidget->setColumnCount(1);
        QTableWidgetItem *__qtablewidgetitem = new QTableWidgetItem();
        tableWidget->setHorizontalHeaderItem(0, __qtablewidgetitem);
        if (tableWidget->rowCount() < 1)
            tableWidget->setRowCount(1);
        QTableWidgetItem *__qtablewidgetitem1 = new QTableWidgetItem();
        tableWidget->setVerticalHeaderItem(0, __qtablewidgetitem1);

       tableWidget->setObjectName(QString::fromUtf8("tableWidget"));
        tableWidget->setGeometry(QRect(8, 6, 349, 199));
        tableWidget->setStyleSheet(QString::fromUtf8("QTableWidget { \n"
"background: red; \n"
"} \n"
"QHeaderView { \n"
"background: transparent; \n"
"}\n"
"QHeaderView::section { \n"
"background: transparent; \n"
"border: 1px solid black; \n"
"};"));

        retranslateUi(Dialog);

        QMetaObject::connectSlotsByName(Dialog);
    } // setupUi

    void retranslateUi(QDialog *Dialog)
    {
        Dialog->setWindowTitle(QApplication::translate("Dialog", "Dialog", 0, QApplication::UnicodeUTF8));
        QTableWidgetItem *___qtablewidgetitem = tableWidget->horizontalHeaderItem(0);
        ___qtablewidgetitem->setText(QApplication::translate("Dialog", "New Column", 0, QApplication::UnicodeUTF8));
        QTableWidgetItem *___qtablewidgetitem1 = tableWidget->verticalHeaderItem(0);
        ___qtablewidgetitem1->setText(QApplication::translate("Dialog", "New Row", 0, QApplication::UnicodeUTF8));
        Q_UNUSED(Dialog);
    } // retranslateUi

};

В итоге создание строк и колонок перенес в конструктор диалога

Цитировать
#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent), ui(new Ui::Dialog)
{
    ui->setupUi(this);
  
    if (ui->tableWidget->columnCount() < 1)
        ui->tableWidget->setColumnCount(1);
    QTableWidgetItem *__qtablewidgetitem = new QTableWidgetItem();
    ui->tableWidget->setHorizontalHeaderItem(0, __qtablewidgetitem);
    if (ui->tableWidget->rowCount() < 1)
        ui->tableWidget->setRowCount(1);
}

Dialog::~Dialog()
{
    delete ui;
}

Тестовый пример прилагаю.
Спасибо всем за помощь.
« Последнее редактирование: Январь 17, 2012, 21:27 от Dimas » Записан

qt 4.8.6, qt 5.12.4
stima
Гость
« Ответ #7 : Январь 17, 2012, 22:51 »

Не вьехал, а что нужно?)

п.с. Используй "являеться", а "не реализован по средствам" для ui. Намного облегчит жизнь.
Записан
Dimas
Чайник
*
Offline Offline

Сообщений: 50



Просмотр профиля
« Ответ #8 : Январь 17, 2012, 23:08 »

Я создал проект используя Creator. Потом в свойствах Edit Style Sheet изменил вид таблицы в Designer. Код в ui_dialog.h создан автоматически. Меня это устраивает. Дальше в коде Dialog.cpp я собирался наполнять таблицу данными. Что плохого в таком подходе?
Записан

qt 4.8.6, qt 5.12.4
stima
Гость
« Ответ #9 : Январь 17, 2012, 23:36 »

Причем тут это, ты бы хоть погуглил о чем я.

Код:
class MyWidget : public QWidget, public Ui_MyWidget {    //является
    
};

void MyWidget::foo()
{
   //ui->button->setEnebled(true); //уже не надо использовать ui
    button->setEnebled(true); //button это часть класса
}

MyWidget::~MyWidget()
{
    //delete ui;   //ненадо заботиться о освобождении памяти и связаных с этим возможных проблем
}

итого, приятней  читать, причем это я считаю идеалогически правлиьным для ui

Записан
Dimas
Чайник
*
Offline Offline

Сообщений: 50



Просмотр профиля
« Ответ #10 : Январь 18, 2012, 06:46 »

Согласен, удобней читать.
Но, при создании Creator`ом каркас класса имеет вид:

Цитировать
#ifndef DIALOG_H
#define DIALOG_H

#include <QtGui/QDialog>

namespace Ui
{
    class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H

Цитировать
#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent), ui(new Ui::Dialog)
{
    ui->setupUi(this);

}

Dialog::~Dialog()
{
    delete ui;
}

Я всего лишь добавил код в конструктор.
Записан

qt 4.8.6, qt 5.12.4
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #11 : Январь 18, 2012, 12:39 »

итого, приятней  читать, причем это я считаю идеалогически правлиьным для ui
не согласен. когда количество переменных в классе разрастается (тем более не всегда все элементы интерфейса рисуются в дизайнере), вспоминать как там что называется не очень удобно, а так написал ui. - и среда подсказала тебе.
Но, при создании Creator`ом каркас класса имеет вид:
это можно изменить в настройках (вкладка Дизайнер)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
andrew.k
Гость
« Ответ #12 : Январь 18, 2012, 12:49 »

итого, приятней  читать, причем это я считаю идеалогически правлиьным для ui
не согласен. когда количество переменных в классе разрастается (тем более не всегда все элементы интерфейса рисуются в дизайнере), вспоминать как там что называется не очень удобно, а так написал ui. - и среда подсказала тебе.
Но, при создании Creator`ом каркас класса имеет вид:
это можно изменить в настройках (вкладка Дизайнер)
Согласен во всем. Хорошо, что не придется писать это)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 22.