Написание заставки с помощью Qt creator — отображение предварительного просмотра в настройках заставки

В начале я хочу извиниться за мой английский. Теперь давайте перейдем к моей проблеме.

Я пытаюсь написать заставку, используя Qt Creator (v5.0.1). Теперь у меня есть окно конфигурации (запущенное приложение с параметром «/ c»), полноэкранное окно (запущенное приложение с параметром «/ s»), и у меня нет окна предварительного просмотра (запущенное приложение с «/ p» и » 1234567 «параметры, где 1234567 — это дескриптор, и он может быть любым числом. У меня проблема с правильным использованием этого дескриптора. Я нашел несколько примеров, но все они не работают. Вот пример:
Создание заставки для Windows. Я пытался скопировать этот код и заставить его работать на моей машине, но было несколько проблем. Некоторые из них я решил, но один я не могу. Вот часть кода:

QApplication app(argc, argv);
QStringList arguments = app.arguments();

/* parse the commandline:
* "[-/][Cc]" or no arguments for configuration mode
* "[-/][Ss]", for fullscreen mode
* "[-/][Pp][ :][0-9]+" for preview mode
*/
Mode mode = ConfigurationMode;
WId parent = 0;
bool OK = arguments.size()<=1;
for(int i=1;i<arguments.size();i++)
{
if(arguments[i].size()<2)
break;
switch(arguments[i][1].toLatin1())
{
case 'c': case 'C':
mode = ConfigurationMode;
OK = true;
break;

case 's': case 'S':
mode = FullScreenMode;
OK = true;
break;

case 'p': case 'P':
if(arguments[i].size()>=4 && arguments[i][2]==':')
parent = (WId)arguments[i].mid(3).toUInt(&OK);
else if(arguments.size()>i)
parent = (WId)arguments[i+1].toUInt(&OK);
mode = PreviewMode;
break;
}
}

И затем вторая часть кода:

ScreenSaverWidget* widget = new ScreenSaverWidget;
widget->setAttribute(Qt::WA_DeleteOnClose);
QObject::connect(widget, SIGNAL(destroyed()), &app, SLOT(quit()));
switch(mode)
{
case ConfigurationMode:
{
QSettings settings("QT", "Screen Saver");
int animationSpeed = settings.value("animationSpeed", 10).toInt();
//animationSpeed = QInputDialog::getInteger(0, "Configure Screen Saver", "Set Animation speed (0-100%)", animationSpeed, 0, 100);
animationSpeed = QInputDialog::getInt(0, "configure Screen Saver", "Set Animation speed (0-100%)",animationSpeed, 0, 100);
settings.setValue("animationSpeed", animationSpeed);
}
return 0;

case FullScreenMode:
new ScreenSaverEventFilter(widget);
widget->showFullScreen();
break;

case PreviewMode:
{
widget->setWindowFlags(Qt::FramelessWindowHint|Qt::SubWindow);
::SetParent(widget->winId(), parent);// <---
RECT parentRect;
::GetClientRect(parent, &parentRect);// <---
widget->move(0,0);
widget->resize(parentRect.right, parentRect.bottom);
widget->show();
}
}
return app.exec();

У меня три ошибки:

неправильное преобразование из ‘WId {aka unsigned int}’ в ‘HWND’ [-fpermissive]

в две строки, которые отмечены во второй части кода.
Есть кто-нибудь, кто знает, как заставить это работать? Есть ли возможность сделать это с Qt? (дескриптор генерируется окном из window.h, и я хочу установить его в качестве родителя виджета Qt, это возможно?)

И еще одна мысль — заставить мою заставку (в режиме предварительного просмотра) реагировать на входные события, например, закрывать событие (из окна «Настройки заставки экрана»), как это сделать?

РЕДАКТИРОВАТЬ 2015.06.14 ————————-

Хорошо, я решил первую проблему, я добавил явное преобразование:

    (...)
::SetParent((HWND)widget->winId(), (HWND)parent);// <---
RECT parentRect;
::GetClientRect((HWND)parent, &parentRect);// <---
(...)

но теперь проблема в том, что мое приложение не реагирует ни на какие сигналы из окна «Настройки заставки», например (и это наиболее важно), оно не закрывается, когда должно — когда я выбираю другую заставку или когда я закрываю Окно настроек заставки (я должен убить процесс с помощью диспетчера задач). Есть ли кто-нибудь, кто знает и может написать здесь, как заставить мое приложение принимать сигнал закрытия из окна настроек заставки?

0

Решение

Официальный вызов для установки одного виджета в качестве родительского для другого:

void QWidget :: setParent (QWidget * parent)

Конечно, это необходимо для обеспечения правильной обработки сигнала / слота для такого вложенного виджета и т. Д. Я сам предпочел бы вообще не использовать setParent, а создать родительский виджет QMainWindow с вложенным дочерним виджетом, который принимает весь родительский элемент, используя setCentralWidget позвоните, и тогда вам не нужно делать много ненужных вещей с размером и т. д. Но я не знаю всех деталей в вашей программе.

Устанавливает родительский элемент виджета в родительский и сбрасывает флажки окна. Виджет перемещается в позицию (0, 0) в своем новом родителе.

Примечание. Виджет становится невидимым как часть изменения его родителя, даже если он был ранее видимым. Вы должны вызвать show (), чтобы сделать виджет снова видимым.

Что касается изменения размера и оконных флагов. Попробуйте, и если требуется изменение размера, вы, вероятно, можете сделать widget-> resize (parent-> size ()). Что касается флагов, сначала попробуйте без указания их. Есть некоторые сомнения, применима ли эта комбинация к дочернему виджету внутри parent.

В нашем порте приложения для Windows я часто передаю winId () для HWND, и это работает, но помните, что этого можно избежать необходимо Действия с фреймворком Qt и всегда сначала пытайтесь найти правильный путь Qt. Что касается предупреждения компилятора для этого, вы можете использовать reinterpret_cast (widget-> winId ()), если это так.

0

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


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