Я следовал за примерами, которые я нашел, чтобы использовать QWinTaskbarProgress
, Я создал стандарт Qt Widgets Application
в Qt Creator
(Qt 5.3.1) и мой mainwindow.cpp
выглядит так:
#include "mainwindow.h"#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_taskbarButton = new QWinTaskbarButton(this);
m_taskbarButton->setWindow(windowHandle());
m_taskbarButton->setOverlayIcon(style()->standardIcon(QStyle::SP_MediaPlay));
m_taskbarProgress = m_taskbarButton->progress();
m_taskbarProgress->setVisible(true);
m_taskbarProgress->setRange(0, 100);
m_taskbarProgress->setValue(50);
}
MainWindow::~MainWindow()
{
delete ui;
}
Я ожидал, что значок панели задач будет наложен и показывает 50%
Индикатор выполнения после запуска приложения, но панель задач выглядит нормально, как будто ничего не кодировал. Что я делаю неправильно?
На самом деле это похоже на вызов «m_taskbarButton-> setWindow (windowHandle ());» в QMainWindow конструктор не работает и QWinTaskbarProgress не будет отображаться вообще даже после вызова setVisible (true) или show ().
Это должно быть вызвано, как только окно показано как в:
void MainWindow::showEvent(QShowEvent *e)
{
#ifdef Q_OS_WIN32
m_taskbarButton->setWindow(windowHandle());
#endif
e->accept();
}
Ваш и мой код очень похож на пример в Qt Documentation
, Я понятия не имею, почему, но это не работает на моем компьютере тоже. Но я нашел решение:
Создайте singleShot
и установить прогресс в слоте:
В шапке:
private slots:
void echo();
В конструкторе:
QTimer::singleShot(1000,this,SLOT(echo()));
QTimer::singleShot(10,this,SLOT(echo()));//works too
Слот:
void MainWindow::echo()
{
QWinTaskbarButton *button = new QWinTaskbarButton(this);
button->setWindow(windowHandle());
button->setOverlayIcon(style()->standardIcon(QStyle::SP_MediaPlay));
QWinTaskbarProgress *progress = button->progress();
progress->setVisible(true);
progress->setRange(0, 100);
progress->setValue(50);
}
И теперь это работает!