Мой список не получает фокус клавиатуры в Qt - PullRequest
0 голосов
/ 25 марта 2010

Я пытаюсь управлять выводом списка через клавиатуру, он не двигается. Не могли бы вы подсказать, в чем я не прав?

Если я щелкну мышью по списку, он получит фокус. я не знаю, что не так.

 class Newlist : public QWidget
   {
public:
 Newlist(QWidget *parent = 0);
    ~Newlist(){};

public:
    QListView *list;
    QStringListModel *model;


 };

Newlist::Newlist(QWidget *parent)
    : QWidget(parent)
{
 list = new QListView(this);


 list->setViewMode(QListView::ListMode);
 list->setSelectionMode(QAbstractItemView::SingleSelection);

 list->setMinimumSize(300,500);

 model = new QStringListModel(this);

 QStringList strlist;
 strlist<<"Test"<<"fest"<<"mest";

 list->setModel(model);

 model->setStringList(strlist);

   QModelIndex index = model->index(1,0);
   list->setCurrentIndex(index);

   QVBoxLayout *layout = new QVBoxLayout(this);
   layout->addWidget(list);
   setLayout(layout);
   list->setFocus();
}

class Test : public QMainWindow
{

public:
 Test(QWidget *parent = 0);
    ~Test(){};

private:

    Mylistview *newlist;
    QVBoxLayout *layout;
    QStackedWidget *stack;
};

Test::Test(QWidget *parent)
    : QMainWindow(parent)
{

 layout = new QVBoxLayout();
 newlist = new Mylistview(); 
 stack = new QStackedWidget(this);

 stack->addWidget(newlist);

 this->setCentralWidget(stack);

}


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Test test;
    test.showMaximized(); 

    return a.exec();
}

Заранее спасибо

1 Ответ

1 голос
/ 25 марта 2010

Я бы изменил несколько вещей ... Вот модификация, которая немного лучше:

Test::Test(QWidget *parent): QMainWindow(parent)
{
    pMylistview = new QListView();

    QStringListModel* pListModel = new QStringListModel(this);

    QStringList ModelStringList;
    ModelStringList<<"Test"<<"fest"<<"mest";
    pListModel->setStringList(ModelStringList);

    pMylistview->setModel(pListModel);

    QModelIndex Index = pListModel->index(1,0);
    pMylistview->setCurrentIndex(Index);

    this->setCentralWidget(pMylistview);
}

Вот несколько комментариев из вашего кода:

1) Я не уверен, что вы полностью понимаете всю мощь наследования ... Если вы решите расширить класс QListView, ваш новый класс "Newlist" IS станет QlistView, поэтому не нужно создавать один в нем ... Вы можете просто получить доступ к методам QListView через ваш класс NewList, потому что это в основном QListView + некоторые из ваших новых функций ... Может быть, вы хотели сделать что-то еще, и имя вашего класса было выбрано неправильно или это только в вашем примере кода, но позаботьтесь об этом ...

2) Зачем ставить модель в поле зрения ?? Другой вид должен знать ваш первый вид для доступа к модели? Я думаю, вы ошиблись из-за своей первой ошибки ... Вы думали о создании своего представления, затем своей модели ... Это должно быть создано в вашей форме или в менеджере, контроллере и т. Д. ... Основная идея за модельным представлением стоит разделить эти вещи, так что вы можете соединить несколько видов на модели и, следовательно, оставаться разъединенными ...

3) Нет необходимости создавать макет, если вы используете setCentralWidget ...

Надеюсь, это немного поможет!

...