选择焦点上的QLineEdit文本

时间:2010-08-08 11:44:12

标签: qt qt-designer qlineedit

我使用QtDesigner创建了一个对话框。对话框中有一个QLineEdit对象,其中包含一些默认内容。当对话框初始化并且焦点转移到QLineEdit时,我希望自动选择默认内容,因此一旦用户开始写入,之前的内容将被覆盖。

编辑:

在构造函数中:

dialog->accept(); 

connect( dialog, SIGNAL(accepted()), QlineObj, SLOT( selectAll() ) );

4 个答案:

答案 0 :(得分:9)

呼叫

lineEdit->selectAll();
设置默认文本后

。 (也许在对话框构造函数中。)

答案 1 :(得分:7)

有一种更简单的方法可以获得几乎相同的行为,即使用setPlaceholderText()而不是setText()设置默认内容。这将显示灰色的默认内容,一旦QLineEdit获得焦点,它将消失。

答案 2 :(得分:4)

这是一个比较老的问题,但是,尽管如此,我还是在这里寻找这个确切问题的解决方案。可以通过以下方式解决:

创建一个从QLineEdit派生的类,并覆盖标头中的focusInEvent

virtual void focusInEvent(QFocusEvent *event) override;

然后像这样实现它:

void MyLineEdit::focusInEvent(QFocusEvent *event)
{
    // First let the base class process the event
    QLineEdit::focusInEvent(event);
    // Then select the text by a single shot timer, so that everything will
    // be processed before (calling selectAll() directly won't work)
    QTimer::singleShot(0, this, &QLineEdit::selectAll);
}

以防万一其他人想知道如何做到这一点;-)

答案 3 :(得分:0)

您可以将 QApplication::focusChangedQTimer::singleShot 一起使用来选择更改焦点上的所有文本。

通常你的 QApplication 是在 main 中声明的,所以在那里使用 QObject::connect,例如:

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    My_Main_Window w();
    QObject::connect(&a, SIGNAL(focusChanged(QWidget*, QWidget*)),
                     &w, SLOT(my_focus_changed_slot(QWidget*, QWidget*)));
    w.show();

    return a.exec();
}

记得在 My_Main_Window 类中设置公共槽:

public slots:
void my_focus_changed_slot(QWidget*, QWidget*);

然后在您对 my_focus_changed_slot 的定义中,检查第二个 QWidget*(指向新聚焦的小部件)是否与您希望全选的 QLineEdit 相同,并且使用 QTimer::singleShot 执行此操作,以便调用事件循环,然后 QLineEdit 会立即调用 selectAll 槽,例如

void My_Main_Window::focus_changed(QWidget*, QWidget* new_widget) {
    if (new_widget == my_lineedit) {
        QTimer::singleShot(0, my_lineedit, &QLineEdit::selectAll);
    }
}

其中 my_lineedit 是指向 QLineEdit 的指针,并且是 My_Main_Window 类的一部分。