grabWindow конкретное окно [дубликат]

Вы возвращаете строку, которая просто говорит фразу _name + _number + _date + _salary.

То, что вы, вероятно, хотели сделать, это построить строку, используя эти поля. Если вы хотите, чтобы все они были собраны вместе Concat , он был бы очень не читаемым

public override string ToString()
{
    return String.Concat(_name, _number, _date, _salary);
}

Однако было бы лучше использовать Format и включают метки со значениями

public override string ToString()
{
    return String.Format("Name:{0}, Number:{1}, Date:{2}, Salary:{3}",_name, _number, _date, _salary);
}

. Если вы используете C # 6 или новее, вы можете использовать следующий формат очистки

public override string ToString()
{
    return $"Name:{_name}, Number:{_number}, Date:{_date}, Salary:{_salary}";
}

. Который является точным той же логики, что и предыдущая версия String.Format.

8
задан Switch 21 November 2009 в 02:43
поделиться

6 ответов

Я уверен, что это зависит от платформы. winIds - это HWND в Windows, поэтому вы можете вызвать FindWindow(NULL, "Untitled - Notepad") в примере, который вы дали.

2
ответ дан ChrisV 19 August 2018 в 11:13
поделиться

Хотя на это уже был дан ответ, только для полноты, я добавлю к сообщению Тревора Бойда Смита (см. выше) пример кода:

void MainWindow::on_myButton_GUI_Screeshot_clicked()
{
    QPixmap qPixMap = QPixmap::grabWidget(this);  // *this* is window pointer, the snippet     is in the mainwindow.cpp file

    QImage qImage = qPixMap.toImage();

    cv::Mat GUI_SCREENSHOT = cv::Mat(         qImage.height(),
                                              qImage.width(), CV_8UC4,
                                      (uchar*)qImage.bits(),
                                              qImage.bytesPerLine()  );

    cv::imshow("GUI_SCREENSHOT",GUI_SCREENSHOT);
}
0
ответ дан dim_tz 19 August 2018 в 11:13
поделиться

Посмотрите класс QDesktopWidget. Он унаследован от QWidget, поэтому буквально нет проблем с отображением снимков:

QPixmap pm(QDesktopWidget::screenGeometry().size());
QDesktopWidget::screen().render(&pm); // pm now contains screenshot
2
ответ дан GreenScape 19 August 2018 в 11:13
поделиться
  • 1
    Для версии 4.8 мне пришлось внести небольшие изменения в ваш фрагмент. В основном: создайте объект типа QDesktopWidget для вызова screenGeometry() и screen() и смените screen().render() на screen()->render(), так как screen() возвращает QWidget*. – Adri C.S. 22 April 2015 в 10:38

Также посмотрите на WindowFromPoint и EnumChildWindows. Последнее может позволить вам предлагать пользователю устранить неоднозначность, если у вас несколько окон с тем же названием.

1
ответ дан Jake Petroules 19 August 2018 в 11:13
поделиться

Взгляните на Пример скриншота

Короче:

QScreen *screen = QGuiApplication::primaryScreen();
if (screen)
    QPixmap originalPixmap = screen->grabWindow(0);
2
ответ дан Nya 19 August 2018 в 11:13
поделиться

Для Qt, как вы делаете снимок экрана для определенного окна, нужно:

/*------ Take a screenshot of a window ------*/
// window is a: QWidget *window;
originalPixmap = QPixmap::grabWidget(window); 
3
ответ дан Trevor Boyd Smith 19 August 2018 в 11:13
поделиться
  • 1
    Я не понимаю, почему в этом ответе так много оборотов. Это просто неправильно. OP запросил любое окно, а не одно приложение. Он даже подчеркивает, что в своем примере он имеет другое применение («Блокнот»). – leemes 16 September 2014 в 18:27
Другие вопросы по тегам:

Похожие вопросы: