3

かなり長い間これを行おうとしていて、見つけたすべてのフォーラム投稿からアドバイスを受けましたが、それでも解決できません。これは私の現在のコードであり、プログレスバーのチャンクの色を変更したいと思います。色を除いて、他のすべての設定が機能しています。

メインウィンドウの1つのサブビューを埋める私のワークスペースオブジェクト。

Workspace::Workspace( QWidget* parent) : QWidget( parent )
{
    QTableView* tableView = new QTableView();
    // ...
    tableView->setItemDelegate(new ProgressBarDelegate);
}

デリゲート.cppは次のようになります。

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

void ProgressBarDelegate::paint( QPainter *painter,
                                 const QStyleOptionViewItem &option,
                                 const QModelIndex &index) const
{
    if (index.column() == 2)
    {
        int progressPercentage = index.model()->data(index, Qt::DisplayRole).toInt();

        QStyleOptionProgressBarV2 progressBarOption;
        progressBarOption.rect = QRect(option.rect.x(), option.rect.y() + 5 , option.rect.width(), option.rect.height() / 1.5);
        progressBarOption.minimum = 0;
        progressBarOption.maximum = 100;
        progressBarOption.progress = progressPercentage;
        QPalette pal = progressBarOption.palette;
        QColor col = QColor(35, 35,25);
        pal.setColor(QPalette::Highlight, col); // or QPalette::Window doesnt matter
        progressBarOption.palette = pal;

        if(option.state & QStyle::State_Selected)
        {
        }

        QApplication::style()->drawControl( QStyle::CE_ProgressBar,
                                            &progressBarOption,
                                            painter);
    }
    else
    {
        QStyledItemDelegate::paint(painter, option, index);
    }
}

現在、私が何をしても、色はOSX標準のライトグレーから変わりません。

重要な場合は、OSX10.6.7およびQt4.8.1を実行します。ありがとう!

編集:

私は次のことができました:

app.setStyleSheet("QScrollBar:horizontal { border: 2px solid green;background: cyan;height: 15px;margin: 0px 20px 0 20px;}");

しかし、私がこれを行うとき:

app.setStyleSheet("QProgressBar:horizontal { border: 1px solid gray; border-radius: 3px; background: white; padding: 1px; }");

プログレスバーの変更はありません。私は理論的にはプログレスバーオブジェクトを作成していません。デリゲートでデータを表示する方法を設定するだけです。しかし、確かに、私はこれを正しくやりたいと思う最初の人になることはできませんか?

また、これが機能しない場合、テーブルビューでこれを(スタイル付きのプログレスバーを使用して)行うにはどうすればよいですか?

4

2 に答える 2

9

Qt Style Sheetを使用する必要があります。これにより、多くのコントロールの UI をカスタマイズして、プラットフォーム間で独自のルック アンド フィールを提供できます。これを確認してください

新しい単純な Qt Gui プロジェクトを作成し、UI フォーム エディターを開き、ツール ウィンドウの [ウィジェットの表示] の下からプログレス バー コントロールを追加します。MainWindow..のコンストラクターに次のコードを記述します。

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

    // Customize progress-bar's style..

    QString style = "QProgressBar {border: 2px solid grey; border-radius: 5px; text-align: center;}";
    style += "QProgressBar::chunk {background-color: #CD96CD; width: 10px; margin: 0.5px;}";

    // Assuming objectName is 'progressBar'..
    ui->progressBar->setStyleSheet(style);
}

コンパイルして実行します。

その単一のコントロールを変更するだけの場合QProgressBarは、上記の方法で十分ですが、アプリケーション レベルでスタイルを適用する場合 (すべてのQProgressBarコントロールと他のコントロールなど)、適切な方法は、*.cssファイルを作成し、 Qt Styleを使用してスタイルを記述することです。 Sheet Referenceを開き、Qt でそのファイルを読み取り、呼び出します

QApplication::setStyleSheet(QString style).

また、スタイル シートは CSS と同じ構文を使用し、さまざまなセレクターにも対応しています。

編集:

上記の方法は、デリゲートではなくコントロールでのみ機能することに同意します。代表者向けのものも見つけました。次の関数を試してくださいpaint

void ProgressBarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if (index.column() == 2)
    {
        QProgressBar renderer;
        int progressPercentage = index.model()->data(index, Qt::DisplayRole).toInt();

        // Customize style using style-sheet..

        QString style = "QProgressBar { border: 2px solid grey; border-radius: 5px; }";
        style += "QProgressBar::chunk { background-color: #05B8CC; width: 20px; }";

        renderer.resize(option.rect.size());
        renderer.setMinimum(0);
        renderer.setMaximum(100);
        renderer.setValue(progressPercentage);

        renderer.setStyleSheet(style);
        painter->save();
        painter->translate(option.rect.topLeft());
        renderer.render(painter);
        painter->restore();
    }
    else
        QStyledItemDelegate::paint(painter, option, index);
}

ここでのポイントは、 を使用する代わりにQStyleOption、コントロール自体をレンダラーとして直接使用できることです。お役に立てれば..

于 2012-05-17T05:46:32.020 に答える
0

それ以外のpal.setColor(QPalette::Window, col);

使用するpal.setColor(QPalette::Highlight, col);

これはすべきworkです。

Painteventでコードを使用しました

   void Dialog::paintEvent(QPaintEvent *e)
   {
    QPainter painter(this);
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(ShowPrintDialog()));
    QStyleOptionProgressBarV2 progressBarOption;
    progressBarOption.rect = QRect(20,20,30,30);
    progressBarOption.minimum = 0;
    progressBarOption.maximum = 100;
    progressBarOption.progress = 75;
    QPalette pal = progressBarOption.palette;
    QColor col = QColor(0,255,0);
    pal.setColor(QPalette::Highlight, col);
    progressBarOption.palette = pal;


    QApplication::style()->drawControl(QStyle::CE_ProgressBar,&progressBarOption, &painter);
    }
于 2012-05-17T06:15:00.857 に答える