Kesalahan dalam Kode

di Qt, saya ingin menyesuaikan tampilan daftar di QT Symbian. jadi untuk tujuan penyesuaian saya telah menetapkan delegasi untuk tampilan daftar. dan saya juga menangani acara pengecatan.. masalahnya adalah warna teks.

saya tidak mendapatkan warna teks default, ketika item dipilih dari tampilan daftar.

yaitu di bawah kode contoh, saya memiliki dua string yaitu "item" (string utama) dan "Test" (sub-string)

pengundian string utama dengan warna pilihan default, tetapi sub-string tidak akan digambar dengan warna yang sama dengan string utama.

Saya pikir kita perlu menangani pemilihan dan mendapatkan warna palet.. saya tidak mendapatkan cara yang tepat.

tolong beri saya solusinya.

ini kodenya

class SettingDeligate : public QStyledItemDelegate
{
//        Q_OBJECT

    public:
        explicit SettingDeligate(QObject* parent = 0);
        virtual ~SettingDeligate();
        enum ItemDataRole {SubheaderTextRole = Qt::UserRole + 100};
        QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const;
        void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
};

SettingDeligate::SettingDeligate(QObject* parent)
        : QStyledItemDelegate(parent)
{
}

SettingDeligate::~SettingDeligate()
{
}

QSize SettingDeligate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const
{
        QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
        QString line1 = index.data(Qt::DisplayRole).toString();
        QString line2 = index.data(SubheaderTextRole).toString();

        int textW = qMax(option.fontMetrics.width(line1), option.fontMetrics.width(line2));
        //QSize iconSize = icon.actualSize(option.decorationSize);
        QSize iconSize(27,19);
        return QSize(qMax(textW, iconSize.width()) + 4,
                     iconSize.height() + 2 + option.fontMetrics.lineSpacing() * 2 + 4);    
}

void SettingDeligate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
      QStyledItemDelegate::paint(painter,option,index);
      QString headerText(qvariant_cast<QString>(index.model()->data(index, SubheaderTextRole)));
          QPoint point1 (option.rect.topLeft());
      painter->drawText(point1.x()+25,point1.y()+25,headerText);
}
int main(int argc, char *argv[])
{
        QApplication a(argc, argv);

        QListView *MylistView = new QListView();
        MylistView->setViewMode(QListView::ListMode);

        MylistView->setMovement(QListView::Free);
        MylistView->setItemDelegate(new (SettingDeligate));

        MylistView->setSelectionMode(QAbstractItemView::SingleSelection);


         QStandardItemModel *model = new QStandardItemModel();
         MylistView->setModel(model);


                 QStandardItem *item = new QStandardItem("item1");
                 item->setData("Test1", SettingDeligate::SubheaderTextRole);
                 model->appendRow(item);

            QStandardItem *item1 = new QStandardItem("item2");
                item1->setData("Test2", SettingDeligate::SubheaderTextRole);
            model->appendRow(item1);

            QStandardItem *item2 = new QStandardItem("item3");
            item2->setData("Test3", SettingDeligate::SubheaderTextRole);
            model->appendRow(item2);

                QDesktopWidget* desktopWidget = QApplication::desktop();
                //get client rect.
                QRect clientRect = desktopWidget->availableGeometry();

               MylistView->setGeometry(clientRect);
               MylistView->show();
               return a.exec();
}

tolong bantu saya

Terima kasih


person Naruto    schedule 02.03.2010    source sumber
comment
Kenapa Anda menonaktifkan makro Q_OBJECT?   -  person bgs    schedule 02.03.2010
comment
@Karol, makro Q_OBJECT diperlukan hanya jika kita menggunakan sinyal dan slot di QT.. untuk objek meta.. karena saya tidak menggunakan slot sinyal apa pun di sini.. jadi tidak diperlukan   -  person Naruto    schedule 03.03.2010


Jawaban (2)


Coba ini -

void SettingDeligate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    QStyledItemDelegate::paint(painter,option,index);
    QString headerText(qvariant_cast<QString>(index.model()->data(index, SubheaderTextRole)));
    QPoint point1 (option.rect.topLeft());
    QPalette::ColorGroup colorGroup = QPalette::Normal;
    if(!option.state.testFlag(QStyle::State_Enabled))
        colorGroup = QPalette::Disabled;
    else if (!option.state.testFlag(QStyle::Active))
        colorGroup = QPalette::Inactive;

    QPalette::ColorRole colorRole = QPalette::Text;
    if(option.state.testFlag(QStyle::State_Selected))
        colorRole = QPalette::HighlightedText;
    if(option.status.testFlag(QStyle::State_Editing))
        colorRole = QPallete::Text;
    painter->setPen(option.palette.color(colorGroup, colorRole));
    painter->drawText(point1.x()+25,point1.y()+25,headerText);
}

Status pemetaan kelompok warna/peran warna berasal dari bagian gambar teks QCommonStyle::DrawControl untuk elemen CE_ItemViewItem.

person Noah    schedule 02.03.2010
comment
hei, saya mendapat masalah, saat item dipilih.. saya tidak mendapatkan warna default untuk digambar saat item dipilih - person Naruto; 03.03.2010

Ini adalah bug di Qt 4.6.2 untuk symbian.

semoga bisa diperbaiki di rilis berikutnya..

Sekadar informasi....

Lihat di sini

person Naruto    schedule 04.03.2010