如何在不同的窗口上将焦点设置为 QWidget

Posted

技术标签:

【中文标题】如何在不同的窗口上将焦点设置为 QWidget【英文标题】:How to set focus to a QWidget, on a different window 【发布时间】:2013-07-28 07:43:02 【问题描述】:

我在两个不同的 QMainWindow 上创建了两个 QPushButton。我以特定的时间间隔随机分配焦点。这里是代码。

int main(int argc, char **argv)

QApplication a(argc, argv);
QMainWindow *win1= new QMainWindow();
win1->resize(567,578);
win1->move(67,30);
win1->show();

QMainWindow *win2= new QMainWindow();
win2->resize(567,578);
win2->move(97,580);
win2->show();
win1->show();
//win2->setModal(true);

QPushButton *but1 =  new QPushButton(win1);
but1->resize(80,20);
but1->move(100,100);
but1->setText("1");
but1->show();

QPushButton *but2 =  new QPushButton(win2);
but2->resize(80,20);
but2->move(100,300);
but2->setText("2");
but2->show();


while(1)
    if((rand()%2) == 1)
        //win2->lower();
        win1->raise();
        win1->activateWindow();
        win1->setWindowState(Qt::WindowActive);
        win1->setFocus(Qt::ActiveWindowFocusReason);
        but1->setFocus(Qt::ActiveWindowFocusReason);

    
    else
        //win1->lower();
        win2->raise();
        win2->activateWindow();
        win2->setFocus(Qt::ActiveWindowFocusReason);
        but2->setFocus(Qt::ActiveWindowFocusReason);

    

    qApp->processEvents(0x00);
    sleep(2);

但问题是第一个窗口的标题栏没有改变颜色(通常通过可视堆栈来回放置一个窗口会改变标题栏的颜色),即使它已成为顶部窗口视觉上

【问题讨论】:

你不应该在 Qt 中使用sleep。创建一个槽并使用QTimer定期调用这个槽。 【参考方案1】:

如果您将最后一个循环更改为类似的内容,您将获得所需的行为:

    while (1) 
    // Exits if both windows are closed
    if (!win1->isVisible() && (!win2->isVisible())) 
        return 0;
    
    // Eventually changes the focus, if the desired window is still visible
    if((rand() % 2) == 1) 
        if (win1->isVisible()) 
            QApplication::setActiveWindow(win1);
        
    
    else 
        if (win2->isVisible()) 
            QApplication::setActiveWindow(win2);
        
    
    QTime now;
    now.start();
    do 
        qApp->processEvents(0x00);
     while (now.elapsed() < 2000);

无论如何,如果你让你的程序进入睡眠状态,它不会在这段时间内响应用户输入,所以要小心。 该实现非常难看,但它会检查要聚焦的窗口是否仍然可见(即用户尚未关闭它),如果两者都已关闭,则最终退出。 当然我猜你只对setActiveWindow()这件事感兴趣,所以我没有花太多时间写一些漂亮的东西!

【讨论】:

不,它不工作。标题栏不会改变它的颜色,就像它应该做的那样 在这里完美运行,您使用的是什么版本的 Qt 以及在哪个平台上?您是否尝试在焦点更改时推动您的 specebar 以检查正确的按钮是否响应? 然后呢?它没有响应吗?

以上是关于如何在不同的窗口上将焦点设置为 QWidget的主要内容,如果未能解决你的问题,请参考以下文章

Qt实用技巧:将QWidget作为输入窗口,接收键盘消息输入法并且控制输入法悬浮工具栏位置控制

MFC:将焦点设置到子窗口时如何防止应用程序成为前台窗口

如何有选择地让 QWidget 接受鼠标点击的焦点?

我的Qt学习笔记 4 如何在 QWidget 窗口上弹出右键菜单

我的Qt学习笔记 4 如何在 QWidget 窗口上弹出右键菜单

WPF 打开新窗口 如何设置 焦点还在原来的窗口 谢谢