qt pixmap.save не работает

0

В моем скриншоте, взятом за проект, функция QPixmap.save() возвращает ложное значение каждый раз. Однако, когда я копирую примерный проект с Qt-страницы http://qt-project.org/doc/qt-5/qtwidgets-desktop-screenshot-example.html, он работает. Таким образом, он исключает проблему с Windows 7 с разрешениями на файлы.

Поэтому я удивляюсь, почему это терпит неудачу?

Файл widget.h:

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void updateTimer();
    void startScreenshots();
    void stopScreenshots();
    void takeScreenshot();
private:
    Ui::Widget *ui;


    QString initialPath;
    QPixmap currentScreenshot;
    QSpinBox * delaySpinBox;
    QPushButton * startButton;
    QPushButton * stopButton;
    QHBoxLayout * hboxLayout;
    QGroupBox * groupBox;
    QTimer * timer;
    void setInitialPath();
    void addStuff();
};

widget.cpp

#include "widget.h"
#include "ui_widget.h"

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

    addStuff();
}

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

void Widget::updateTimer()
{
    timer->stop();
    int milisecs = delaySpinBox->value() *1000;
    timer->start( milisecs );
}

void Widget::startScreenshots()
{
    timer->start( delaySpinBox->value() * 1000 );
}

void Widget::stopScreenshots()
{
    timer->stop();
}

void Widget::takeScreenshot()
{
    //take screenshot
    currentScreenshot = QPixmap::grabWindow(QApplication::desktop()->winId());

    //save screenshot
    QString format = "png";

    QDateTime local( QDateTime::currentDateTime() );
    QString date = local.toString();
    QString fileName = initialPath + date;

    if(!currentScreenshot.save(fileName, format.toLatin1().constData()) )
    {
        qDebug() << "didnt save\n";
        QMessageBox::information(this,"failed to save","failed to save");
    }
}

void Widget::setInitialPath()
{
    initialPath = QFileDialog::getExistingDirectory(this, tr("Open Directory"),
      "/home",
      QFileDialog::ShowDirsOnly
       | QFileDialog::DontResolveSymlinks);
}

void Widget::addStuff()
{
  timer = new QTimer(this);
  connect(timer,SIGNAL(timeout()),this,SLOT(takeScreenshot()) );

  delaySpinBox = new QSpinBox(this);
  delaySpinBox->setValue(60);
  delaySpinBox->setSuffix(tr(" s"));
  connect( delaySpinBox,SIGNAL(valueChanged(int)),this,SLOT(updateTimer()) );

  startButton = new QPushButton(this);
  startButton->setText("start");
  connect(startButton,SIGNAL(clicked()),this,SLOT(startScreenshots()) );

  stopButton = new QPushButton(this);
  stopButton->setText("stop");
  connect(stopButton,SIGNAL(clicked()),this,SLOT(stopScreenshots()) );

  hboxLayout = new QHBoxLayout(this);
  hboxLayout->addWidget(startButton);
  hboxLayout->addWidget(stopButton);
  hboxLayout->addWidget(delaySpinBox);

  groupBox = new QGroupBox(tr("Options"));
  groupBox->setLayout(hboxLayout);

  setLayout(hboxLayout);
}
Теги:
qt
qpixmap

3 ответа

1
Лучший ответ
QDateTime local( QDateTime::currentDateTime() ) 

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

Решение: кулак из всех, попробуйте удалить dateTime из имени файла и посмотреть, работает ли он. Если вы хотите использовать dateTime, попробуйте отформатировать его без запрещенных символов

Запрещенные символы в Windows, например:

< (less than)
> (greater than)
: (colon)
" (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)

QDateTime всегда возвращает строку, содержащую двоеточие, но это запрещено, и вы не можете ее использовать, вы должны ее заменить.

1

Он работает только под Linux. Помимо ответа @Chernobyl, AFAIK QPixmap :: save не добавляет суффикс автоматически, поэтому вам нужно изменить

QString fileName = initialPath + date;

в

QString fileName = initialPath + date.replace(":", "-") + ".png";

(Часть .replace(":", "-") предназначена для экранирования запрещенного символа ":" в имени файла)

1

Когда вы создаете имя файла и его путь следующим образом:

QString fileName = initialPath + date;

У вас будет путь, похожий на

C: /Users/ВашеИмя/Фотографии

для вашего первоначального пути.

Пока ваша дата будет в формате

Вс Сен 7 11:35:46 2014

Поэтому во время вашей конкатенации вы получите что-то вроде

C:/Пользователи /YourName/PicturesSun Sep 7 11:35:46 2014

Если присмотреться, здесь есть немало проблем:

  1. Вам не хватает "/" в конце вашего начального пути
  2. Ваша дата Строка содержит символы, которые Windows не разрешает имена файлов
  3. После сохранения в файле будет отсутствовать его расширение, оно также должно быть добавлено в конец вашего имени файла String.

Необходимые исправления:

Вам нужно изменить формат даты на что-то приемлемое для Windows, используя

QString date = local.toString("Действительный формат QDateTime для окон")

QString fileName = initialPath + "/" + date + "." + формат;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню