Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Dimas от Январь 17, 2012, 10:52



Название: Изменение стиля QHeaderView в QTableWidget
Отправлено: Dimas от Январь 17, 2012, 10:52
Меняю стиль прорисовки таблицы в дизайнере с помощью правки стилей в "Edit Style Sheet".

Пред просмотром (CTRL + ALT + R) получается как мне нужно:
(http://i29.fastpic.ru/big/2012/0117/47/1f61340d9f348f6d2019f9b40ea3b047.png)

а, при запуске exe получается так:
(http://i32.fastpic.ru/big/2012/0117/3d/e2ad76a7d62af2a37e8c4d088071a93d.png)

Вот код стилей:
Цитировать
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



Название: Re: Изменение стиля QHeaderView в QTableWidget
Отправлено: Bepec от Январь 17, 2012, 12:16
При запуске, насколько я понял, предпросмотра, используется Qt шное представление.

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


Название: Re: Изменение стиля QHeaderView в QTableWidget
Отправлено: Dimas от Январь 17, 2012, 12:58
Как решить эту проблему?


Название: Re: Изменение стиля QHeaderView в QTableWidget
Отправлено: stima от Январь 17, 2012, 14:01
Код:
QHeaderView { color: rgb(255, 255, 255), padding-left: 4px; }
QHeaderView::section { background: transparent; }


Название: Re: Изменение стиля QHeaderView в QTableWidget
Отправлено: Dimas от Январь 17, 2012, 14:20
Код:
QHeaderView { color: rgb(255, 255, 255), padding-left: 4px; }
QHeaderView::section { background: transparent; }

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


Название: Re: Изменение стиля QHeaderView в QTableWidget
Отправлено: stima от Январь 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();
}


Название: Re: Изменение стиля QHeaderView в QTableWidget
Отправлено: Dimas от Январь 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;
}

Тестовый пример прилагаю.
Спасибо всем за помощь.


Название: Re: Изменение стиля QHeaderView в QTableWidget
Отправлено: stima от Январь 17, 2012, 22:51
Не вьехал, а что нужно?)

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


Название: Re: Изменение стиля QHeaderView в QTableWidget
Отправлено: Dimas от Январь 17, 2012, 23:08
Я создал проект используя Creator. Потом в свойствах Edit Style Sheet изменил вид таблицы в Designer. Код в ui_dialog.h создан автоматически. Меня это устраивает. Дальше в коде Dialog.cpp я собирался наполнять таблицу данными. Что плохого в таком подходе?


Название: Re: Изменение стиля QHeaderView в QTableWidget
Отправлено: stima от Январь 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



Название: Re: Изменение стиля QHeaderView в QTableWidget
Отправлено: Dimas от Январь 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;
}

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


Название: Re: Изменение стиля QHeaderView в QTableWidget
Отправлено: kambala от Январь 18, 2012, 12:39
итого, приятней  читать, причем это я считаю идеалогически правлиьным для ui
не согласен. когда количество переменных в классе разрастается (тем более не всегда все элементы интерфейса рисуются в дизайнере), вспоминать как там что называется не очень удобно, а так написал ui. - и среда подсказала тебе.
Но, при создании Creator`ом каркас класса имеет вид:
это можно изменить в настройках (вкладка Дизайнер)


Название: Re: Изменение стиля QHeaderView в QTableWidget
Отправлено: andrew.k от Январь 18, 2012, 12:49
итого, приятней  читать, причем это я считаю идеалогически правлиьным для ui
не согласен. когда количество переменных в классе разрастается (тем более не всегда все элементы интерфейса рисуются в дизайнере), вспоминать как там что называется не очень удобно, а так написал ui. - и среда подсказала тебе.
Но, при создании Creator`ом каркас класса имеет вид:
это можно изменить в настройках (вкладка Дизайнер)
Согласен во всем. Хорошо, что не придется писать это)