QT - 设计器窗体中的 QPushButton Class 无法单击具有 MainWIndow Parent 的小部件
QT - QPushButton in Designer Form Class Widget with MainWIndow Parent can't be clicked
我遇到了 Qt 问题。
TL;DR
我的设计器表单 class 继承自 QWidget 并包含一个按钮。我使用父参数从这个 class 构造一个对象,它是一个 MainWindow 对象。显示了小部件,但无法单击按钮,不会对鼠标悬停做出反应,但是当使用 tab 键突出显示按钮并按下 space 时会触发类似 onclick 的事件。
这是我的主要功能:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow *w;
if(argc == 2)
{
w = new MainWindow(argv[1]);
}
else
{
w = new MainWindow();
}
w->show();
return a.exec();
}
这是主窗口的来源:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow (parent),
ui(new Ui::MainWindow),
todoWidget(nullptr)
{
ui->setupUi(this);
todoWidget = new TodoWidget(nullptr, this);
todoWidget->setEnabled(true);
}
MainWindow::MainWindow(const char *saveFilePath, QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
todoWidget(new TodoWidget(saveFilePath, this))
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
delete todoWidget;
}
todoWidget 是 MainWindow class 的私有成员。我知道,如果在 QWidget 的构造函数中给出父级,则小部件将在父级内部绘制。发生这种情况,但小部件中的按钮不可点击。如果我按 Tab 直到它处于焦点而不是按 space,我能够触发类似 onclick 的东西,但它甚至对鼠标悬停也没有反应。 TodoWidget class 是一个 Designer Form Class,现在我将它简化为只有 1 个元素,即按钮。
这是 TodoWidget 来源:
TodoWidget::TodoWidget(const char *path, QWidget *parent) :
QWidget (parent),
t (nullptr),
ui(new Ui::TodoWidget)
{
ui->setupUi(this);
if(!path)
{
path = "./tasks/taks";
}
open(path);
makeConnections();
todoModel = new TaskListModel(t->tasksWithStatus(Task::Status::TODO), this);
inProgressModel = new TaskListModel(t->tasksWithStatus(Task::Status::IN_PROGRESS), this);
finishedModel = new TaskListModel(t->tasksWithStatus(Task::Status::FINISHED), this);
// ui->todoView->setModel(todoModel);
// ui->inProgressView->setModel(inProgressModel);
// ui->finishedView->setModel(finishedModel);
}
TodoWidget::~TodoWidget()
{
delete t;
delete ui;
}
void TodoWidget::open(const char *path)
{
if(validateSaveFile(path))
{
delete t;
t = new todo(path, this);
this->path = path;
}
}
void TodoWidget::progressTask(unsigned int index)
{
t->progressTask(index);
}
void TodoWidget::displaySuccess(const QString &msg)
{
QMessageBox::information(this, "Success", msg);
}
void TodoWidget::displayError(const QString &errMsg)
{
QMessageBox::critical(this, "Error", errMsg);
}
void TodoWidget::changeProject(const char *path)
{
open(path);
}
void TodoWidget::addButtonClicked()
{
AddWindow *addWindow = new AddWindow(this);
connect(addWindow, &AddWindow::addTask, [this](const QString &args)->void{addTask(args);});
addWindow->show();
}
bool TodoWidget::validateSaveFile(const QString &path)
{
/*
* C:/ and (wordchar 0 or more times/) 0 or more times
* ./ and (wordchar 0 or more times/) 0 or more times
* / and (wordchar 0 or more times/) 0 or more times
* (wordchar 0 or more times/) 0 or more times
*
* Note: the parentheses are not present in the regexp
* Note: wordchar is any character which might be part of a word (alfanum and _ I think)
*/
QRegularExpression regexp("([a-zA-Z]:/|[.]{0,2}/)?((.*)/)*");
QRegularExpressionMatch match = regexp.match(path);
if(!match.hasMatch())
{
emit someError("Not a valid file");
return false;
}
else
{
QDir sp(match.captured(0));
if(!sp.exists())
{
sp.mkpath(".");
}
}
QFile file(path);
if(!file.open(QIODevice::Append | QIODevice::Text))
{
emit someError(QString("Can't open file") + file.errorString());
return false;
}
return true;
}
void TodoWidget::makeConnections()
{
connect(t, &todo::taskAdded, this, &TodoWidget::displaySuccess);
connect(t, &todo::taskNotAdded, this, &TodoWidget::displayError);
connect(t, &todo::taskMadeProgress, this, &TodoWidget::displaySuccess);
connect(t, &todo::noProgress, this, &TodoWidget::displayError);
connect(t, &todo::saved, this, &TodoWidget::displaySuccess);
connect(t, &todo::notSaved, this, &TodoWidget::displayError);
connect(this, &TodoWidget::addTask, t, &todo::addTask);
connect(this, &TodoWidget::someError, this, &TodoWidget::displayError);
connect(this->ui->addButton, &QPushButton::clicked, this, &TodoWidget::addButtonClicked);
}
void TodoWidget::modelStuff()
{
}
t 是 TodoWidget 的私有成员。类型是待办事项。我认为没有必要展示代码,因为它应该与GUI无关,因为它是一个共享库(我用Qt创建的)。
我现在尝试了几种方法,我什至记不住它们,但是 none 有效。我将不胜感激任何帮助。谢谢
主窗口以中央小部件停靠区、状态栏、菜单栏的形式预定义了布局etc.So任何小部件都需要设置到这些区域才能正常工作。
尝试通过调用 mainWindow.setcentralwidget(todowidget).
来设置对话框
我遇到了 Qt 问题。
TL;DR
我的设计器表单 class 继承自 QWidget 并包含一个按钮。我使用父参数从这个 class 构造一个对象,它是一个 MainWindow 对象。显示了小部件,但无法单击按钮,不会对鼠标悬停做出反应,但是当使用 tab 键突出显示按钮并按下 space 时会触发类似 onclick 的事件。
这是我的主要功能:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow *w;
if(argc == 2)
{
w = new MainWindow(argv[1]);
}
else
{
w = new MainWindow();
}
w->show();
return a.exec();
}
这是主窗口的来源:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow (parent),
ui(new Ui::MainWindow),
todoWidget(nullptr)
{
ui->setupUi(this);
todoWidget = new TodoWidget(nullptr, this);
todoWidget->setEnabled(true);
}
MainWindow::MainWindow(const char *saveFilePath, QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
todoWidget(new TodoWidget(saveFilePath, this))
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
delete todoWidget;
}
todoWidget 是 MainWindow class 的私有成员。我知道,如果在 QWidget 的构造函数中给出父级,则小部件将在父级内部绘制。发生这种情况,但小部件中的按钮不可点击。如果我按 Tab 直到它处于焦点而不是按 space,我能够触发类似 onclick 的东西,但它甚至对鼠标悬停也没有反应。 TodoWidget class 是一个 Designer Form Class,现在我将它简化为只有 1 个元素,即按钮。 这是 TodoWidget 来源:
TodoWidget::TodoWidget(const char *path, QWidget *parent) :
QWidget (parent),
t (nullptr),
ui(new Ui::TodoWidget)
{
ui->setupUi(this);
if(!path)
{
path = "./tasks/taks";
}
open(path);
makeConnections();
todoModel = new TaskListModel(t->tasksWithStatus(Task::Status::TODO), this);
inProgressModel = new TaskListModel(t->tasksWithStatus(Task::Status::IN_PROGRESS), this);
finishedModel = new TaskListModel(t->tasksWithStatus(Task::Status::FINISHED), this);
// ui->todoView->setModel(todoModel);
// ui->inProgressView->setModel(inProgressModel);
// ui->finishedView->setModel(finishedModel);
}
TodoWidget::~TodoWidget()
{
delete t;
delete ui;
}
void TodoWidget::open(const char *path)
{
if(validateSaveFile(path))
{
delete t;
t = new todo(path, this);
this->path = path;
}
}
void TodoWidget::progressTask(unsigned int index)
{
t->progressTask(index);
}
void TodoWidget::displaySuccess(const QString &msg)
{
QMessageBox::information(this, "Success", msg);
}
void TodoWidget::displayError(const QString &errMsg)
{
QMessageBox::critical(this, "Error", errMsg);
}
void TodoWidget::changeProject(const char *path)
{
open(path);
}
void TodoWidget::addButtonClicked()
{
AddWindow *addWindow = new AddWindow(this);
connect(addWindow, &AddWindow::addTask, [this](const QString &args)->void{addTask(args);});
addWindow->show();
}
bool TodoWidget::validateSaveFile(const QString &path)
{
/*
* C:/ and (wordchar 0 or more times/) 0 or more times
* ./ and (wordchar 0 or more times/) 0 or more times
* / and (wordchar 0 or more times/) 0 or more times
* (wordchar 0 or more times/) 0 or more times
*
* Note: the parentheses are not present in the regexp
* Note: wordchar is any character which might be part of a word (alfanum and _ I think)
*/
QRegularExpression regexp("([a-zA-Z]:/|[.]{0,2}/)?((.*)/)*");
QRegularExpressionMatch match = regexp.match(path);
if(!match.hasMatch())
{
emit someError("Not a valid file");
return false;
}
else
{
QDir sp(match.captured(0));
if(!sp.exists())
{
sp.mkpath(".");
}
}
QFile file(path);
if(!file.open(QIODevice::Append | QIODevice::Text))
{
emit someError(QString("Can't open file") + file.errorString());
return false;
}
return true;
}
void TodoWidget::makeConnections()
{
connect(t, &todo::taskAdded, this, &TodoWidget::displaySuccess);
connect(t, &todo::taskNotAdded, this, &TodoWidget::displayError);
connect(t, &todo::taskMadeProgress, this, &TodoWidget::displaySuccess);
connect(t, &todo::noProgress, this, &TodoWidget::displayError);
connect(t, &todo::saved, this, &TodoWidget::displaySuccess);
connect(t, &todo::notSaved, this, &TodoWidget::displayError);
connect(this, &TodoWidget::addTask, t, &todo::addTask);
connect(this, &TodoWidget::someError, this, &TodoWidget::displayError);
connect(this->ui->addButton, &QPushButton::clicked, this, &TodoWidget::addButtonClicked);
}
void TodoWidget::modelStuff()
{
}
t 是 TodoWidget 的私有成员。类型是待办事项。我认为没有必要展示代码,因为它应该与GUI无关,因为它是一个共享库(我用Qt创建的)。
我现在尝试了几种方法,我什至记不住它们,但是 none 有效。我将不胜感激任何帮助。谢谢
主窗口以中央小部件停靠区、状态栏、菜单栏的形式预定义了布局etc.So任何小部件都需要设置到这些区域才能正常工作。 尝试通过调用 mainWindow.setcentralwidget(todowidget).
来设置对话框