16

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

编辑:

在构造函数中:

dialog->accept(); 

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

4 回答 4

12

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

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

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);
}

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

于 2018-08-12T08:54:40.983 回答
10

称呼

lineEdit->selectAll();

设置默认文本后。(也许在对话框构造函数中。)

于 2010-08-08T13:53:20.843 回答
8

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

于 2015-02-05T13:32:03.973 回答
0

您可以使用QApplication::focusChangedwithQTimer::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);
    }
}

wheremy_lineedit是指向 a 的指针,QLineEdit并且是My_Main_Window类的一部分。

于 2021-03-30T14:24:22.473 回答