如何在应用启动时设置小部件焦点?

2 投票
1 回答
3786 浏览
提问于 2025-04-18 02:29

我想在应用程序启动时让 QLineEdit 这个控件获得焦点,但不知道为什么总是失败。调用一个包含 QLineEdit_object.setFocus() 的方法,当我点击按钮时,这个方法能正常工作。但是在启动时,似乎根本没有执行这个方法,即使我把它设置为在控件创建后初始化。

我是在用 Python 的 PySide。

# coding=utf-8
import sys
import PySide.QtGui as QG
import PySide.QtCore as QC

class GG(QG.QMainWindow):
    def __init__(self):
        super(GG, self).__init__()
        self.move(0,0)
        self.resize(400,300)
        self.setWindowTitle('Demo')

        self.tabw = QG.QTabWidget()
        self.tab1 = Tab1()
        self.tab2 = Tab2()

        self.tabw.addTab(self.tab1, 'Tab1')
        self.tabw.addTab(self.tab2, 'Tab2')

        hbox = QG.QHBoxLayout()
        hbox.addWidget(self.tabw)

        self.setCentralWidget(self.tabw)
        self.setLayout(hbox)
        self.show()

class Tab1(QG.QWidget):
    def __init__(self):
        super(Tab1, self).__init__()

        self.btns()
        self.inputt()
        self.layoutz()
        self.inp.setFocus() # doesn't set the focus on startup ?
        self.show()

    def inputt(self):
        self.inp = QG.QLineEdit('', self)

    def btns(self):
        self.btn1 = QG.QPushButton('Button1', self)
        self.btn1.clicked.connect(self.focusit) # works just fine

    def layoutz(self):
        vbox = QG.QVBoxLayout()   
        vbox.addWidget(self.btn1)
        vbox.addStretch(1)
        vbox.addWidget(self.inp)
        self.setLayout(vbox)

    def focusit(self):
        self.inp.setFocus() # works just fine


class Tab2(Tab1):
    def __init__(self):
        super(Tab2, self).__init__()


def main():
    app = QG.QApplication(sys.argv)
    a = GG()
    sys.exit(app.exec_())

if __name__ == '__main__':
   main()

1 个回答

1

好吧,经过一番尝试,我想出了这个解决方案:

import sys
import PySide.QtGui as QG
import PySide.QtCore as QC

class GG(QG.QMainWindow):
    def __init__(self):
        super(GG, self).__init__()
        self.move(0,0)
        self.resize(400,300)
        self.setWindowTitle('Demo')

        self.tabw = QG.QTabWidget()
        self.tab1 = Tab1()
        self.tab2 = Tab2()

        self.tabw.addTab(self.tab1, 'Tab1')
        self.tabw.addTab(self.tab2, 'Tab2')

        hbox = QG.QHBoxLayout()
        hbox.addWidget(self.tabw)

        self.setCentralWidget(self.tabw)
        self.setLayout(hbox)
        self.tab2.inp.setFocus() # setting focus right here
        self.tab1.inp.setFocus() # and here; notice the order
        self.show()

class Tab1(QG.QWidget):
    def __init__(self):
        super(Tab1, self).__init__()

        self.btns()
        self.inputt()
        self.layoutz()
        self.show()

    def inputt(self):
        self.inp = QG.QLineEdit('', self)

    def btns(self):
        self.btn1 = QG.QPushButton('Button1', self)
        self.btn1.clicked.connect(self.focusit)

    def layoutz(self):
        vbox = QG.QVBoxLayout()   
        vbox.addWidget(self.btn1)
        vbox.addStretch(1)
        vbox.addWidget(self.inp)
        self.setLayout(vbox)

    def focusit(self):
        self.inp.setFocus()


class Tab2(Tab1):
    def __init__(self):
        super(Tab2, self).__init__()


def main():
    app = QG.QApplication(sys.argv)
    a = GG()
    sys.exit(app.exec_())

if __name__ == '__main__':
   main()

撰写回答