Как я могу сделать снимок экрана, используя Qt / C ++ с различными мониторами?

Я новичок в Qt Creator, но я пытаюсь создать и применить приложение, которое делает снимок экрана каждую минуту, я нашел код в Qt Creator, чтобы сделать это, но он работает только с одним монитором, если у меня его два или более только делает снимок экрана одного из мониторов.

это код, который я использую.

это скриншот

#ifndef SCREENSHOT_H
#define SCREENSHOT_H

#include <QPixmap>
#include <QWidget>

class QCheckBox;
class QGridLayout;
class QGroupBox;
class QHBoxLayout;
class QLabel;
class QPushButton;
class QSpinBox;
class QVBoxLayout;

class screenshot : public QWidget
{
Q_OBJECT

public:
screenshot();

protected:
void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE;

private slots:
void newScreenshot();
void saveScreenshot();
void shootScreen();
void updateCheckBox();

private:
void createOptionsGroupBox();
void createButtonsLayout();
QPushButton *createButton(const QString &text, QWidget *receiver, const char *member);
void updateScreenshotLabel();

QPixmap originalPixmap;

QLabel *screenshotLabel;
QGroupBox *optionsGroupBox;
QSpinBox *delaySpinBox;
QLabel *delaySpinBoxLabel;
QCheckBox *hideThisWindowCheckBox;
QPushButton *newScreenshotButton;
QPushButton *saveScreenshotButton;
QPushButton *quitScreenshotButton;

QVBoxLayout *mainLayout;
QGridLayout *optionsGroupBoxLayout;
QHBoxLayout *buttonsLayout;
};

#endif // SCREENSHOT_H

и это скриншот.

#include <QtWidgets>

#include "screenshot.h"
screenshot::screenshot()
{
screenshotLabel = new QLabel;
screenshotLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
screenshotLabel->setAlignment(Qt::AlignCenter);
screenshotLabel->setMinimumSize(240, 160);

createOptionsGroupBox();
createButtonsLayout();

mainLayout = new QVBoxLayout;
mainLayout->addWidget(screenshotLabel);
mainLayout->addWidget(optionsGroupBox);
mainLayout->addLayout(buttonsLayout);
setLayout(mainLayout);

shootScreen();
delaySpinBox->setValue(5);

setWindowTitle(tr("Screenshot"));
resize(300, 200);
}

void screenshot::resizeEvent(QResizeEvent * /* event */)
{
QSize scaledSize = originalPixmap.size();
scaledSize.scale(screenshotLabel->size(), Qt::KeepAspectRatio);
if (!screenshotLabel->pixmap() || scaledSize != screenshotLabel->pixmap()->size())
updateScreenshotLabel();
}

void screenshot::newScreenshot()
{
if (hideThisWindowCheckBox->isChecked())
hide();
newScreenshotButton->setDisabled(true);

QTimer::singleShot(delaySpinBox->value() * 1000, this, SLOT(shootScreen()));
}

void screenshot::saveScreenshot()
{
QString format = "jpg";
QString initialPath = QDir::currentPath() + tr("/untitled.") + format;

QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), initialPath,
tr("%1 Files (*.%2);;All Files (*)")
.arg(format.toUpper())
.arg(format));
if (!fileName.isEmpty())
originalPixmap.save(fileName, format.toLatin1().constData());
}

void screenshot::shootScreen()
{
if (delaySpinBox->value() != 0)
qApp->beep();
originalPixmap = QPixmap(); // clear image for low memory situations
// on embedded devices.
QScreen *screen = QGuiApplication::primaryScreen();
if (screen)
originalPixmap = screen->grabWindow(0);
updateScreenshotLabel();

newScreenshotButton->setDisabled(false);
if (hideThisWindowCheckBox->isChecked())
show();
}

void screenshot::updateCheckBox()
{
if (delaySpinBox->value() == 0) {
hideThisWindowCheckBox->setDisabled(true);
hideThisWindowCheckBox->setChecked(false);
} else {
hideThisWindowCheckBox->setDisabled(false);
}
}

void screenshot::createOptionsGroupBox()
{
optionsGroupBox = new QGroupBox(tr("Options"));

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

delaySpinBoxLabel = new QLabel(tr("Screenshot Delay:"));

hideThisWindowCheckBox = new QCheckBox(tr("Hide This Window"));

optionsGroupBoxLayout = new QGridLayout;
optionsGroupBoxLayout->addWidget(delaySpinBoxLabel, 0, 0);
optionsGroupBoxLayout->addWidget(delaySpinBox, 0, 1);
optionsGroupBoxLayout->addWidget(hideThisWindowCheckBox, 1, 0, 1, 2);
optionsGroupBox->setLayout(optionsGroupBoxLayout);
}

void screenshot::createButtonsLayout()
{
newScreenshotButton = createButton(tr("New Screenshot"), this, SLOT(newScreenshot()));
saveScreenshotButton = createButton(tr("Save Screenshot"), this, SLOT(saveScreenshot()));
quitScreenshotButton = createButton(tr("Quit"), this, SLOT(close()));

buttonsLayout = new QHBoxLayout;
buttonsLayout->addStretch();
buttonsLayout->addWidget(newScreenshotButton);
buttonsLayout->addWidget(saveScreenshotButton);
buttonsLayout->addWidget(quitScreenshotButton);
}

QPushButton *screenshot::createButton(const QString &text, QWidget *receiver,
const char *member)
{
QPushButton *button = new QPushButton(text);
button->connect(button, SIGNAL(clicked()), receiver, member);
return button;
}

void screenshot::updateScreenshotLabel()
{
screenshotLabel->setPixmap(originalPixmap.scaled(screenshotLabel->size(),
Qt::KeepAspectRatio, Qt::SmoothTransformation));
}

Может ли кто-нибудь помочь мне изменить этот код или сказать, как я могу это сделать?

Спасибо

0

Решение

QGuiApplication класс имеет экраны () метод, который возвращает список указателей на все объекты QScreen для компьютера. Таким образом, вы хотите использовать это, и, например, замените этот код:

QScreen *screen = QGuiApplication::primaryScreen();
if (screen)
originalPixmap = screen->grabWindow(0);

с чем-то вроде этого:

QList<QScreen *> screens = QGuiApplication::screens();
QList<QPixmap> pixmapsList;
for (int i=0; i<screens.size(); i++)
{
const QRect r = screens[i]->geometry();
pixmapsList.push_back(screens[i]->grabWindow(0), r.x(), r.y(), r.width(), r.height());
}

… тогда, конечно, вам нужно будет изменить код сохранения файла, чтобы сохранить каждый QPixmap в pixmapsList, а не просто один QPixmap, но это легко сделать.

1

Другие решения


По вопросам рекламы [email protected]